我对struct类型有所了解.但我无法理解:它是为了什么?我什么时候用它?类,简单的值类型和枚举 - 这就是我所需要的.
有什么建议?
UPD:请!不要告诉我结构在堆栈中(我知道这个:).什么结构用于?
我正在使用会话来保存自定义对象UserSession,我像这样访问会话:
UserSession TheSession = HttpContext.Current.Session["UserSession"] as UserSession;
Run Code Online (Sandbox Code Playgroud)
然后,在我的代码中,我像这样修改了TheSession的属性
TheSession.Prop1 = some new value;
Run Code Online (Sandbox Code Playgroud)
我的问题是:当我更改值时,它是否会更改HttpContext.Current.Session ["UserSession"]中的会话内的值或仅更改TheSession变量,在这种情况下,我需要将对象变量重新分配给会议.
谢谢.
每当我尝试在C#或.net中搜索类和结构之间的差异时,我最终都会对值类型或引用类型这两个内容进行概念性概述,其中变量被分配等等.但我需要一些实际的差异.我发现一些像赋值运算符的不同行为,有构造函数等.任何人都可以提供一些更实际的差异,这些差异在编码时会直接有用吗?就像使用一个但不与其他或相同操作显示不同行为的东西一样.关于这两个的一些常见错误.
另外请建议在哪里考虑使用结构而不是类.并且不应该使用结构.
编辑:我是否必须显式调用构造函数或只是声明一个struct类型变量就足够了?(我应该把它作为一个新问题?)
是否所有CLR值类型(包括用户定义的structs)都独立地存在于评估堆栈中,这意味着它们永远不需要被垃圾收集器回收,或者是否存在垃圾收集的情况?
我之前已经问过一个关于流畅的接口对.NET应用程序的运行时性能的影响的问题.我特别担心创建大量非常短暂的临时对象会通过更频繁的垃圾收集对运行时性能产生负面影响.
现在我已经知道,如果我将这些临时对象的类型声明为struct(即用户定义的值类型)而不是class,如果事实证明所有值类型都只存在于垃圾收集器上,则可能根本不涉及垃圾收集器.评估堆栈.
(这对我来说主要是因为我在考虑C++处理局部变量的方式.通常是自动(auto)变量,它们被分配在堆栈上,因此当程序执行回到调用者时释放 - 没有动态内存管理通过new/ delete参与其中.我认为CLR 可能会处理struct类似的问题.)
我做了一个简短的实验,看看为用户定义的值类型和引用类型生成的CIL有什么不同.这是我的C#代码:
struct SomeValueType { public int X; }
class SomeReferenceType { public int X; }
.
.
static void TryValueType(SomeValueType vt) { ... }
static void TryReferenceType(SomeReferenceType rt) { ... }
.
.
var vt = new SomeValueType { X = 1 };
var rt = new SomeReferenceType { X = …Run Code Online (Sandbox Code Playgroud) 我有以下不允许的代码(下面的错误),为什么?
struct A
{
private int b;
public A(int x)
{
B = x;
}
public int B
{
get { return b; }
set { b=value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
在将所有字段分配给字段之前,不能使用'this'对象'Test.x'必须在控制返回给调用者之前完全分配
class foo {
public readonly int bar;
};
foo a = new foo() { bar = 123 };
Run Code Online (Sandbox Code Playgroud)
error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer)
如何bar在上面的对象初始化程序中指定?
我可以初始化readonly成员而无需为每个类/结构编写自定义构造函数吗?
我正在制作一个2D平台游戏并代表我正在使用2D数组的瓦片,这些瓦片是具有位置,类型和各种标志字段的类.当我class将tile类中的关键字更改为时struct,加载的地图消耗的内存减少约20%.
我不知道这个动作的正确与否,我只是想知道为什么内存消耗的差异.
编辑:数字为1038 MB,瓦片为类,845 MB为结构(没有大部分游戏数据).
我经常发现自己想要沿着这些方向做点什么:
Form form = new Form();
form.ClientSize.Width = 500;
Run Code Online (Sandbox Code Playgroud)
当然编译器现在会抱怨此代码无效,因为ClientSize是属性,而不是变量.
我们可以通过完整设置ClientSize来解决这个问题:
form.ClientSize = new Size(500, ClientSize.Height);
Run Code Online (Sandbox Code Playgroud)
或者,一般情况下:
Size s = form.ClientSize;
s.Width = 500;
form.ClientSize = s; //only necessary if s is a value-type. (Right?)
Run Code Online (Sandbox Code Playgroud)
但这看起来都是不必要的,也是模糊不清的.为什么编译器不能为我做这个?当然,我问的是一般情况,可能涉及更深层次的属性,而不仅仅是上面的世俗例子
基本上,我问为什么没有语法糖将该行form.ClientSize.Width = 500转换为上述代码.这只是一个尚未实现的功能,它是为了避免来自不同的getter和setter的副作用的堆叠,以防止在没有定义其中一个setter时产生混淆,或者是否存在完全不同的原因这不存在?
假设我有一个实现IDisposible的结构类型,如果我使用下面的代码:
using (MyStruct ms = new MyStruct())
{
InnerAction(ms); //Notice "InnerAction" is "InnerAction(MyStruct ms)"
}
Run Code Online (Sandbox Code Playgroud)
当然我看到在使用块之后,ms被处理掉了.然而,"InnerAction"中的结构呢?它是否仍然存在,因为深层复制或它也处置?
如果它仍然存活(未处理),我必须使用"ref"作为"InnerAction"吗?
请给我你的证明:)
大家好.
c# ×9
struct ×5
.net ×2
class ×2
properties ×2
arrays ×1
asp.net ×1
c#-4.0 ×1
clr ×1
idisposable ×1
using ×1
value-type ×1