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
参考技术AC#中的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是啥?的主要内容,如果未能解决你的问题,请参考以下文章