我了解struct
类型的一些内容。但是我不明白:它有什么作用?何时应该使用?类、简单值类型和枚举 - 这就是我需要的全部东西。
有什么建议吗?
更新:请!不要告诉我struct
在堆栈中(我知道这个)。struct
的作用是什么?
我了解struct
类型的一些内容。但是我不明白:它有什么作用?何时应该使用?类、简单值类型和枚举 - 这就是我需要的全部东西。
有什么建议吗?
更新:请!不要告诉我struct
在堆栈中(我知道这个)。struct
的作用是什么?
如果你想要值类型语义,那么你选择结构体。如果你想要引用类型语义,那么你选择类。其他所有问题都次于这个问题。
MSDN提供了一份指南:在类和结构之间进行选择:
如果类型的实例很小且通常具有短生命周期,或者通常嵌入到其他对象中,请考虑定义结构而不是类。
除非该类型具有以下所有特征,请勿定义结构:
- 它逻辑上表示单个值,类似于原始类型(例如整数、双精度等)。
- 它的实例大小小于16个字节。
- 它是不可变的。
- 它不会经常被装箱。
应该是一个结构体的东西(因为它们是值):
struct Color
struct Point
struct Rectangle
struct GLVertex
(包含位置、颜色、法线和纹理坐标)struct DateTime
应该是一个类的东西(因为它们是你要引用的东西):
class RandomGenerator
class Socket
class Thread
class Window
为什么呢? 看看下面的代码。
class Button
{
public Point Location { get; set; }
}
class Program
{
public static void Main()
{
var button = Util.GetButtonFromSomewhere();
var location = button.Location;
Util.DrawText("one", location);
location.Y += 50;
Util.DrawText("two", location);
location.Y += 50;
Util.DrawText("three", location);
}
}
var location = button.Location
感觉应该复制一个值,而不是引用!换句话说,我们认为Point是一个值类型而不是引用类型。这里的“value”是以数学意义的“value”使用的。考虑数字5,它是一个抽象对象,“在某个地方”,你只是“引用”它。类似地,一个Point只是存在。它没有存在的地方,我们无法更改它。因此,我们选择将其作为结构体,以便它具有用户期望的语义。class Button { public Window Parent { get; set; } }
。在这里,Parent是一个实体,所以我们用引用类型表示它-Window。使用像myButton.Parent.Redraw();
这样的代码可能是有意义的。因此,Window应该是一个类。Foo a = b; a.Mutate();
应该做什么?简单的值类型最好通过结构体实现。
Struct Usage Guidelines
It is recommended that you use a struct for types that meet any of the following criteria:
* Act like primitive types. * Have an instance size under 16 bytes. * Are immutable. * Value semantics are desirable.
您还需要了解类实例是在堆上分配的。结构体是值类型,分配在栈上。
首先,您必须了解值类型和引用类型之间的区别。我假设您已经知道这是什么,因为您要求跳过此部分。
Struct是一个值类型,您可以获得使用值类型时所拥有的所有特权。
结构体是按值传递的。例如:
DateTime time = new DateTime(); DateTime newTime = time; //您不是在引用time //相反,您创建了一个新实例
结构体并不是轻量级的类,它们可能有很多方法,只看DateTime
结构就知道了。
结构体在性能上可能更轻量级,但并非总是如此。考虑将大型结构体传递给一个方法。因为结构体是值类型,每次将其传递到一个方法中时,都会创建一个结构体的新实例,因此每次都会复制结构体。如果您有一个相当大的结构体,这将是一个更大的性能损失。
由于结构体是值类型,因此您可能偶尔需要对其进行装箱和取消装箱。
简而言之,请使用结构体来表示内存中的原子值。
当你想要一个具有值语义(而不是引用语义)的“类”时,可以使用结构体。
如果你不知道为什么需要它,那么你可能不需要它。
结构体是值类型而不是引用类型。如果你不知道这意味着什么,那么你可能不需要它。