English 中文(简体)
修缮C#的nes
原标题:Modifying nested structs in c#
  • 时间:2010-04-12 16:44:48
  •  标签:
  • c#
  • struct

谁能告诉我,为什么评论的法典系(以前是)没有编纂? 这是否与随后的界线相同?

public struct OtherStruct
{
    public int PublicProperty { get; set; }
    public int PublicField;

    public OtherStruct(int propertyValue, int fieldValue)
        : this()
    {
        PublicProperty = propertyValue;
        PublicField = fieldValue;
    }

    public int GetProperty()
    {
        return PublicProperty;
    }
    public void SetProperty(int value)
    {
        PublicProperty = value;
    }
}

public struct SomeStruct
{
    public OtherStruct OtherStruct { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        SomeStruct a = new SomeStruct();
        //a.OtherStruct.PublicProperty++;
        a.OtherStruct.SetProperty(a.OtherStruct.GetProperty() + 1);
    }
}
最佳回答

<编码> 一些标准. 其他标准是财产,退还价值,而不是变数。 本条:

a.OtherStruct.PublicProperty++;

请:

a.get_OtherStruct().PublicProperty++;

由于<代码>a.get_ OtherStruct(> is a Value ,而不是variable,因此,该词的用意如下:

OtherStruct tmp = a.get_OtherStruct();
tmp.PublicProperty++;

更改<代码>PublicProperty在copy上通过该财产退还的“其他标准的价值,根本不改变原有价值。 这几乎肯定不是你的意图。 C#设计师发现这种问题,并设法在许多情形下加以禁止。

请注意,如果<代码>其他标准为参考类型(类别),则应为参比<>>。 这一点被复制,而不是其中的数值......这样改动了<代码>tmp.PublicPropertywould。 See my article on reference and Value category for more information.

反之,像这种变幻不定的 st,通常是一种真正坏的想法。 它们造成各种问题,并造成难以预测的守则。

EDIT: 针对您的“回答”,两行aren t。 同样:<代码>a. 其他标准 财产表述是指转让经营人或复合转让经营人的目标。

你可以辩称,像C#一样,你的定义是允许这样做(尽管我仍然不同意),但汇编者(is正确执行规格。 详见C#3.0第10.7.2节。

问题回答

Apologies for not using a comment, I don t think it will fit. Jon, this is not an actual implementation, I m just trying to get a deeper understanding of structs, so no worries about me implementing mutable structs :)

无论如何,我不相信你是正确的。 考虑这一法典与第一个例子几乎相同:

public struct SomeStruct
页: 1
    public int PublicProperty 页: 1 get; set; iii
    public int PublicField;

    public SomeStruct(int propertyValue, int fieldValue)
        : this()
    页: 1
        PublicProperty = propertyValue;
        PublicField = fieldValue;
    iii

    public int GetProperty()
    页: 1
        return PublicProperty;
    iii
    public void SetProperty(int value)
    页: 1
        PublicProperty = value;
    iii
iii

class Program
页: 1
    static void Main(string[] args)
    页: 1
        SomeStruct a = new SomeStruct(1, 1);
        a.PublicProperty++;
        a.SetProperty(a.GetProperty()+1);
    iii
iii

现在,用弹道看sil,主要方法如下:

私人隐蔽的方法

页: 1

.entrypoint

// Code size       45 (0x2d)

.maxstack  3

.locals init ([0] valuetype ConsoleApplication1.SomeStruct a)

IL_0000:  nop

IL_0001:  ldloca.s   a

IL_0003:  ldc.i4.1

IL_0004:  ldc.i4.1

IL_0005:  call       instance void ConsoleApplication1.SomeStruct::.ctor(int32,
                                                                         int32)
IL_000a:  nop

IL_000b:  ldloca.s   a

IL_000d:  dup

IL_000e:  call       instance int32 

ConsoleApplication1.SomeStruct:get_Publicproperty()

IL_0013:  ldc.i4.1

IL_0014:  add

IL_0015:  call       instance void 

ConsoleApplication1.SomeStruct:set_PublicProperty(int32)

IL_001a:  nop

IL_001b:  ldloca.s   a

IL_001d:  ldloca.s   a

IL_001f:  call       instance int32 ConsoleApplication1.SomeStruct::GetProperty()

IL_0024:  ldc.i4.1

IL_0025:  add

IL_0026:  call       instance void ConsoleApplication1.SomeStruct::SetProperty(int32)

IL_002b:  nop

IL_002c:  ret

iii

我对可怕的格局表示歉意,我不敢肯定如何使这种安排正常。 无论如何,希望你们能够看到,主要方法中最后两条守则实际上相同。

因此,我想,从前一个职位来看,这一行文如下:

a.OtherStruct.PublicProperty++;

实际与后线相同:

 a.OtherStruct.SetProperty(a.OtherStruct.GetProperty() + 1);

因此,在我看来,第一行并不仅仅因为汇编者不支持它而汇编成册,而并非因为其不合法。

你认为什么?

结构不应在缺乏这样做的良好理由的情况下暴露类似外地的再造财产。 相反,它们应当直接暴露田地。 Most of the "problems” which are contributed to "mutable ructs” are really problems with ructs that exposureed-write property. 举例来说,如果你简单地将<条码>其他条码的编号改为“SomeStruct为领域,而不是适当搭配(即失去<条码>{>; },那么便不会出现松动的阻塞。

请注意,一个“问题”的人有“可变障碍”,与“变体”代码(<>t<>t有关(有些情况下,与外地相似的特性确实如此),其原因在于以下法规:

  someStructType myThing = MyDataSupplier.GetSomeData();
  myThing.someField = something;

更改<代码>myThing后,打折至 MyDataSupplier 如果没有这样的守则:

  MyCollection[whatever] = myThing;

我的反应将是“自然的”。 了解<代码>sStructType 是与外地编码<编码> 部分外地<>代码/代码>相容的,足以知道<代码>myThing.some 外地 可以在不损害宇宙任何其他东西的情况下加以改变 相比之下,如果要替换myClassType的成员(无论是外地还是财产),则上述代码“远见”可明确改变MyDataSupplier中的数据,或者可能不会改变,而这种修改可能会或可能不利于系统状态的其他方面。 实际上,申诉是,人们会采取可以预测的行为,但不一定总是与他们想要做的事情相匹配,而不是根据许多事情,包括在某些情况下其他消费者使用<代码>MyDataSupplier<>。 请注意,如果> 暴露了一种再婚财产,而不是一个领域,那么就必须审查与该财产有关的代码,以确定该财产是否可能影响其援引的结构之外的东西。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签