如果属性访问,C#Struct方法不会保存值
我需要创建一个看起来像int的结构(但是我需要一个额外的字段……),所以我创建了一个名为TestStruct的新结构,添加了一个我需要的方法(test())并重载了一些运算符,它看起来运作良好……
下面的示例显示了问题.如果从Val属性执行结构test()方法,那么Val属性似乎会丢失该值,但如果该方法在Val2变量上执行,则该值似乎保持正确的值… 为什么会这样? static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { new TestClass(); } } public class TestClass { public TestStruct Val { get; set; } private TestStruct Val2; public TestClass() { Val.test(); Console.WriteLine(Val + "-> why is it not 10?"); //Direct assignment works well... Val = 123; Console.WriteLine(Val + "-> direct assingment works.."); //This way works too. Why doesn't it work with "get;" and "set;"? Val2.test(); Console.WriteLine(Val2 + "-> it works this way"); } } public struct TestStruct { private Int32 _Value; public long Offset { get; set; } public static implicit operator TestStruct(Int32 value) { return new TestStruct { _Value = value }; } public static implicit operator Int32(TestStruct value) { return value._Value; } public void test() { _Value = 10; } } 解决方法
你的结构是错误的.
由于很多原因,你永远不应该创建一个可变的结构. 就像int或DateTime值是不可变的并且永远不会改变一样,结构的特定值也绝不能改变. 相反,您可以创建返回新的不同值的函数. 以下是可变结构是邪恶的一些原因: > http://ericlippert.com/2008/05/14/mutating-readonly-structs/ 要回答这个问题,Val.test()等同于get_Val().test().由于结构是值类型,`get_Val()(自动生成的属性getter)返回结构的副本.私有支持字段中的原始结构不受影响. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c – SetJmp / LongJmp:为什么这会引发段错?
- 用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字
- Hex文件格式与Keil部分使用技巧
- C#反思为什么GetFields列出我没有创建的字段?如何排除它们
- React Native之React速学教程(中)
- 是什么导致我的Ruby`track`块中出现这种死锁?
- keil4 启动代码关于norflash、nandflash拷贝/开发环境基地址
- VB#中的c# – operator – Interlocked.Increment
- 数组 – Ruby:删除数组的第一个和最后一个元素 – 为什么解
- objective-c – 将数据存储在MKAnnotation中?