C#中的virtula是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中的virtula是啥?相关的知识,希望对你有一定的参考价值。

public virtual void Function_name()

...

有点方法说明是这样的?请问virtual是说明意思,请给详细答案

C#中的virtula的意思是实际上的,实质上的,虚拟的,虚的。Virtual是C++ OO机制中很重要的一个关键字,Virtual方法分为虚方法和抽象方法。

一、Virtual方法(虚方法)

virtual关键字用于在基类中修饰方法。virtual的使用会有两种情况:

情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。

情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。

二、Abstract方法(抽象方法)

abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。

abstract:抽象方法声明使用,是必须被派生类覆写的方法,抽象类就是用来被继承的;可以看成是没有实现体的虚方法;如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法;抽象类不能有实体的。

扩展资料:

virtual标记方法为虚方法:

1.可在派生类中以override覆盖此方法

2.不覆盖也可由对象调用

3.无此标记的方法(也无其他标记),重写时需用new隐藏原方法

abstract 与virtual : 方法重写时都使用 override 关键字

接口定义以大写字母I开头。方法只定义其名称,在C#中,方法默认是公有方法;用public修饰方法是不允许的,否则会出现编译错误;接口可以从别的接口继承,如果是继承多个接口,则父接口列表用逗号间隔。

接口可以通过类来实现,当类的基列表同时包含基类和接口时,列表中首先出现的是基类;类必须要实现其抽象方法。

参考资料:百度百科-virtual

参考技术A

C#中的virtula是一个方法修饰符,标识可被覆载的方法。意思是指实际上的,实质上的,虚拟的,虚的。它是定义虚函数的关键字。Virtual方法分为虚方法和抽象方法。

一、Abstract抽象方法

abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。

abstract:抽象方法声明使用,是必须被派生类覆写的方法,抽象类就是用来被继承的;可以看成是没有实现体的虚方法;如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法;抽象类不能有实体的。

二、Virtual虚方法

virtual关键字用于在基类中修饰方法。virtual的使用会有两种情况:

1、在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。

2、在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。

扩展资料

virtual用虚方法标记:

a、可在派生类中以override覆盖此方法

b、不覆盖也可由对象调用

c、无此标记的方法(也无其他标记),重写时需用new隐藏原方法

abstract 与virtual : 方法重写时都使用 override 关键字

接口可以通过类来实现,当类的基列表同时包含基类和接口时,列表中首先出现的是基类;类必须要实现其抽象方法。

接口定义以大写字母I开头。方法只定义其名称,在C#中,方法默认是公有方法;用public修饰方法是不允许的,否则会出现编译错误;接口可以从别的接口继承,如果是继承多个接口,则父接口列表用逗号间隔。

参考资料:virtual-百度百科

 C#-百度百科

参考技术B virtual关键字用于指定属性或方法在派生类中重写.
再写点吧
默认情况下,派生类类从其基类继承属性和方法,如果继承的属性或方法需要在派生类中有不同的行为,则可以重写它,即可以在派生类中定义该属性或方法的新实现,这时在基类中该属性或方法必须用virtual关键字修饰.virtual关键字用于指定属性或方法时可以在派生类中重写.具有virtual关键字的方法或属性被称作虚拟成员.
class A

public virtual void F()


class B:A

public override void F()
本回答被提问者采纳
参考技术C 在基类(父类)中用virtual修饰符声明一个虚方法,然后在在派生类(子类)中用override修饰符覆盖基类虚方法。表明是对基类的虚方法重载。
这种优势在于它可以在程序运行时再决定调用哪一个方法,这就是所谓的“运行时多态”
或者称动态绑定。
参考技术D 在基类(父类)中用virtual修饰符声明一个虚方法,然后在在派生类(子类)中用override修饰符覆盖基类虚方法。表明是对基类的虚方法重载。
这种优势在于它可以在程序运行时再决定调用哪一个方法,这就是所谓的“运行时多态”,或者称动态绑定。

C# 中的 void* 是啥? [复制]

【中文标题】C# 中的 void* 是啥? [复制]【英文标题】:What is void* in C#? [duplicate]C# 中的 void* 是什么? [复制] 【发布时间】:2013-03-20 15:33:57 【问题描述】:

我正在查看 VC++ 6.00 程序的源代码。我需要将此源代码转换为 C#,但我无法理解此示例中的 (void*) 是什么?

glTexImage2D(
     GL_TEXTURE_2D,
     0,
     GL_RGBA8,
     IMAGE_WIDTH,
     IMAGE_HEIGHT,
     0,
     PIXEL_FORMAT,
     GL_UNSIGNED_BYTE,
     (void*)imageData
 );

在这段代码中 imagedata 是一个指针 byte* 图像数据

【问题讨论】:

void* 可以是任何东西。它应该翻译成什么取决于上下文——在你的情况下可能是byte[] 【参考方案1】:

一般情况下,void* 会在 C# 代码中转换为 IntPtr

编辑更多信息:.NET/C# 中的IntPtr 通常表现得像一个不透明的句柄。您不能直接取消引用它,从中获取“大小”信息(例如,您指向的数组的大小),并且它不会尝试告诉您它指向的数据类型 - 或者即使它是指针。当您将 C/C++ 代码转换为 C# 并看到 void* 时,应使用 IntPtr 编写 C# 代码,直到您更好地了解您正在处理的内容。

pinvoke.net 站点有两个glTexImage2D 条目,具体取决于图像数据的存储位置。如果图像数据存储在 .NET/C# 中的托管byte[] 中,则调用传递byte[] 的版本。如果图像数据存储在非托管内存中,而 C# 代码中的数据只有 IntPtr,则调用传递 IntPtr 的版本。

来自pinvoke.net opengl32的示例:

[DllImport(LIBRARY_OPENGL)] protected static extern void glTexImage2D (
    uint target,
    int level, 
    int internalformat, 
    int width, 
    int height, 
    int border, 
    uint format, 
    uint type, 
    byte[] pixels);
[DllImport(LIBRARY_OPENGL)] protected static extern void glTexImage2D (
    uint target, 
    int level, 
    int internalformat, 
    int width, 
    int height, 
    int border, 
    uint format, 
    uint type, 
    IntPtr pixels);

【讨论】:

在这种情况下会起作用吗?我怀疑传入的是一个字节数组。 1+ 因为您是第一个给出真实答案的人,这反映了他想知道 c# 等价物这一事实。 @Beachwalker 也许这有点为时过早。你不能用IntPtr 做很多事情,根据使用情况,另一种类型在这里可能更合适。 @RobertHarvey 这就是我说“一般而言”的原因。有很多具体的案例,每一个都应该以适当的方式处理。互操作代码不是您希望从“我怀疑......”做出决定的领域 @KonradRudolph 样品?在不使用 unsafe 关键字进行互操作时,IntPtr 是最常见的等价物。为什么早熟?其他任何人都没有回答关于 c# 中的等价物的问题,只是写了 (void) 指针是什么。【参考方案2】:

在 C# 中最典型的是 IntPtr

以下是如何从 C# 调用此函数的示例:

Bitmap bitmap = new Bitmap("blah");
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, 4, bitmap.Width, bitmap.Height, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, bitmap.Scan0);

if(bitmap != null) 
    bitmap.Dispose();

来源:http://www.gamedev.net/topic/193827-how-to-use-glglteximage2d--using-csgl-library-in-c/

如果您拥有的是包含有效图像的byte[],您可以将其加载到位图中:

public static Bitmap BytesToBitmap(byte[] byteArray)

    using (MemoryStream ms = new MemoryStream(byteArray))
    
        Bitmap img = (Bitmap)Image.FromStream(ms);
        return img;
    

如果这给您带来麻烦,或者您的数据不是 Win32 库可以处理的,您可以使用 Marshal 直接从 byte[] 给您一个 IntPtr

IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length);

// Call your function here, passing unmanagedPointer to it

Marshal.FreeHGlobal(unmanagedPointer);

来自: How to get IntPtr from byte[] in C#

【讨论】:

作为答案的好示例,因为它与问题示例(均为 OpenGL)处于相同的上下文中。【参考方案3】:

正如 Jonathan D 在他的数据中解释的那样,void* 是 C 表示不能直接使用的泛型类型的方式。这是 C 实现泛型接口的方式,虽然它在 C# (System.IntPtr) 中具有直接等效项,但您可能想要使用其他东西,因为 C# 具有更好的处理泛型数据的方法,并且不确定您是否需要通过此处为通用数据。

由于您将图像数据传递给函数,因此void* 在 C# 中表示的有几种可能性:

byte[] 将原始图像数据传递给函数 System.Drawing.Color[,] 如果您正在处理更高级别的点数据(不太可能) System.Drawing.Image 如果您想在更高级别上处理图像数据;如果您能侥幸成功,这可能是个好主意 IntPtr 如果您有一个低级缓冲区并且该函数在内部将数据传递给 C API 而不对其自身进行处理。

如果没有关于如何使用代码以及要翻译哪些部分的更多信息,就无法确定您需要哪些类型。

【讨论】:

【参考方案4】:

它将imageData 转换为(void*) 类型,所以基本上是告诉编译器获取这个值并将其视为(void*)

根据我的经验,void* 是一个指向非特定类型的指针。


就将您的示例转换为 c# 而言,您不必太担心在 c++ 中是如何转换的。只需确保将正确的类型传递给相应的 c# 函数即可。

【讨论】:

【参考方案5】:

如前所述,IntPtr 是等价的。

您只能在 c# 中的 unsafe 上下文中使用指针,例如:

void MyMethod(IntPtr ptr)

  unsafe
  
      var vptr = (void*) ptr;
      // do something with the void pointer
  

【讨论】:

【参考方案6】:

void* 是指向未定义类型对象的指针。在 C# 中有多种表示形式:

    作为不安全代码中的未格式化pointer。 作为IntPtr,通常用于在托管对象和非托管对象之间编组指针。 作为object 用于未指定但受管理的对象。

【讨论】:

【参考方案7】:

虚无其实什么都不是,

void的三种使用方式:

参数:int myFunc(void) -- 该函数不接受任何内容。

返回值:void myFunc(int) -- 函数不返回任何内容

通用数据指针:void* data -- 'data' 是指向未知类型数据的指针,不能取消引用

在这种情况下,它是一个通用数据指针。

【讨论】:

这根本没有回答他的问题,我对投票感到困惑。他想知道 C# 中的 void* 等价物是什么,而不是解释什么是 void。 @Adam 作为支持者之一,让我解释一下:我对这个答案并不完全满意(因为你提到的原因),但它是第一个真正解释 void* 是什么的答案,以简洁的方式。如何将它翻译成 C# 取决于它的用法,而 OP 并没有那么公开。

以上是关于C#中的virtula是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 void* 是啥? [复制]

c# 中的类和构造函数在不同程序集中的 c# 中的默认访问说明符是啥 [重复]

C#中的“var”是啥意思? [复制]

C# 中的方法组是啥?

C# 或 .NET 中的程序集到底是啥?

C# 中的“SKU”(属性)是啥意思?