相关疑难解决方法(0)

结构 - 它的用途是什么?

我对struct类型有所了解.但我无法理解:它是为了什么?我什么时候用它?类,简单的值类型和枚举 - 这就是我所需要的.

有什么建议?

UPD:请!不要告诉我结构在堆栈中(我知道这个:).什么结构用于?

c# struct

7
推荐指数
3
解决办法
1432
查看次数

Asp.net - 对会话对象的更改是否仍然存在?

我正在使用会话来保存自定义对象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# asp.net

7
推荐指数
1
解决办法
1489
查看次数

通过参考传递只是遗产吗?

也许这对我来说有点天真,但我似乎无法找到/想到"通过引用传递"的体面用例.更改不可变字符串(正如其他一些Q/As所提到的)通常是可以避免的,返回多个变量通常可以通过返回元组,列表,数组等来更好地处理.

在我看来,MSDN上例子很糟糕; 我只是在Square方法中返回一个值,而不是将其声明为void.

在我看来,它似乎是C#的一个遗留部分,而不是它的一个组成部分.有人比我更聪明可以尝试解释为什么它仍然存在和/或一些实际可行的实际用例(即几乎在每种情况下都可以避免更改不可变字符串).

c# pass-by-reference

7
推荐指数
1
解决办法
303
查看次数

.net中的类和结构之间的实际差异(不是概念性的)?

每当我尝试在C#或.net中搜索类和结构之间的差异时,我最终都会对值类型或引用类型这两个内容进行概念性概述,其中变量被分配等等.但我需要一些实际的差异.我发现一些像赋值运算符的不同行为,有构造函数等.任何人都可以提供一些更实际的差异,这些差异在编码时会直接有用吗?就像使用一个但不与其他或相同操作显示不同行为的东西一样.关于这两个的一些常见错误.

另外请建议在哪里考虑使用结构而不是类.并且不应该使用结构.

编辑:我是否必须显式调用构造函数或只是声明一个struct类型变量就足够了?(我应该把它作为一个新问题?)

.net c# struct class

6
推荐指数
1
解决办法
1740
查看次数

CLR(.NET)如何在内部分配和传递自定义值类型(结构)?

题:

是否所有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)

.net clr garbage-collection memory-management value-type

6
推荐指数
2
解决办法
1895
查看次数

为什么在结构的构造函数中设置属性不起作用?

我有以下不允许的代码(下面的错误),为什么?

    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'必须在控制返回给调用者之前完全分配

c# struct properties

6
推荐指数
2
解决办法
1384
查看次数

如何在对象初始值设定项中分配只读成员变量?

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成员而无需为每个类/结构编写自定义构造函数吗?

c# c#-4.0

6
推荐指数
2
解决办法
2806
查看次数

为什么一个类的数组比结构数组消耗的内存多20%?

我正在制作一个2D平台游戏并代表我正在使用2D数组的瓦片,这些瓦片是具有位置,类型和各种标志字段的类.当我class将tile类中的关键字更改为时struct,加载的地图消耗的内存减少约20%.

我不知道这个动作的正确与否,我只是想知道为什么内存消耗的差异.

编辑:数字为1038 MB,瓦片为类,845 MB为结构(没有大部分游戏数据).

c# arrays struct class

6
推荐指数
1
解决办法
1694
查看次数

为什么我们不能设置属性的属性?

我经常发现自己想要沿着这些方向做点什么:

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时产生混淆,或者是否存在完全不同的原因这不存在?

c# language-design properties

6
推荐指数
1
解决办法
182
查看次数

结构类型的深层副本是否也在"使用......"块中处理?

假设我有一个实现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# struct idisposable using

6
推荐指数
1
解决办法
140
查看次数