Tag: value type

valueType.ToString()是否对valueType进行了强制转换?

让我们说,我在c#中有以下代码 int x = 0; x.ToString(); 这内部做x拳击吗? 有没有办法从视觉工作室看到这种情况?

.NET C#unsafe / fixed不会固定直通数组元素吗?

我有一些并发故障的并发代码,我把问题减少到两个似乎相同的情况,但是一个失败而另一个没有。 我现在花了太多时间试图创建一个失败的最小的完整示例,但没有成功,所以我只是发布失败的行,以防任何人看到明显的问题。 Object lock = new Object(); struct MyValueType { readonly public int i1, i2; }; class Node { public MyValueType x; public int y; public Node z; }; volatile Node[] m_rg = new Node[300]; unsafe void Foo() { Node[] temp; while (true) { temp = m_rg; /* … */ Monitor.Enter(lock); if (temp == m_rg) […]

在C#中,使用值类型与引用类型

我的问题是: 什么时候我们应该使用值类型和引用类型? 一个优于其他的优点和缺点是什么? 如果在任何地方使用引用类型怎么办 它有什么危害吗? 还请讨论每个的优点和缺点。 我也想了解这一点。

为什么值类型不能为null

我知道可以使用Nullable值类型来包装值类型并提供存储null的能力。 但有技术原因是不允许值类型为null或原因只是概念性的?

如何非递归地定义“原始”类型?

由于C#中的struct由其成员的位组成,因此您不能拥有包含任何T字段的值类型T : // Struct member ‘T.m_field’ of type ‘T’ causes a cycle in the struct layout struct T { T m_field; } 我的理解是上述类型的实例永远不能被实例化* – 任何尝试这样做会导致实例化/分配的无限循环(我猜这会导致堆栈溢出? ** ) – 或者,另外,另一个看待它的方式可能是定义本身没有意义; 也许这是一个弄巧成拙的实体,有点像“这句话是假的”。 但奇怪的是,如果你运行这段代码: BindingFlags privateInstance = BindingFlags.NonPublic | BindingFlags.Instance; // Give me all the private instance fields of the int type. FieldInfo[] int32Fields = typeof(int).GetFields(privateInstance); foreach (FieldInfo […]

.NET参数传递 – 按值引用v / s

我试图validation我对C#/ .NET / CLR如何处理值类型和引用类型的理解。 我已经阅读了很多相互矛盾的解释 这就是我今天所理解的,如果我的假设是错误的,请纠正我。 诸如int等的值类型存在于堆栈上,引用类型存在于托管堆上, 但是如果引用类型具有例如double类型的实例变量,则它将与其对象一起存在于堆上 第二部分是我最困惑的。 让我们考虑一个名为Person的简单类。 Person有一个名为Name的属性。 假设我在另一个类中创建了Person实例,我们称之为UselessUtilityClass。 请考虑以下代码: class UselessUtilityClass { void AppendWithUnderScore(Person p) { p.Name = p.Name + “_”; } } 然后我们做的地方: Person p = new Person(); p.Name = “Priest”; UselessUtilityClass u = new UselessUtilityClass(); u.AppendWithUnderScore(p); Person是一个引用类型,当传递给UselessUtilityClass时 – 这就是我去的地方 – 坚果……作为Person引用实例的VARIABLE p由VALUE传递,这意味着当我写p.Name时我会看到“牧师_” 如果我写的话 Person p2 = p; 我做到了 p2.Name […]

你能在一个结构中有一个类吗?

在C#中是否可以使用具有类型类型的成员变量的Struct? 如果是这样,信息在哪里存储,堆栈,堆,或两者?

C#从线程中调用的函数返回值

我有一个计算线程函数,它使用Invoke从其他线程调用消息函数,我希望计算线程从该消息函数获取值(值类型,如整数)。 我怎样才能做到这一点? 问题是我在Invoke(…)之后仍然得到x变量的旧值,我期望值为15 delegate void mes_del(object param); void MyThreadFunc() { … int x = 5; object [] parms = new object []{x}; Invoke(new mes_del(MessageFunc), (object)parms); … } void MessageFunc(object result) { int res = 15; (result as object[])[0] = res; } 我尝试了一些方法,比如使用object [],object作为参数但没有成功。 我虽然拳击/拆箱操作应该在这种情况下发生,但他们不会。 我是否应该像在.NET事件模式中那样使用辅助类型,并创建像类holder {public int x; }

参考和值类型方案

我一直在努力彻底了解参考和价值类型。 就在我以为自己拥有它的时候,我遇到了这个场景…… 我创建了一个包含单个对象的类。 class Container { public object A {get; set;} } 当我创建这个Container类的实例(a)时,我正在创建一个引用类型的实例。 我为类中的对象分配了一个整数。 据我所知,这将被装箱作为一个对象,另一个参考类型。 int start = 1; Container a = new Container{ A=start }; 我创建了Container类的另一个实例(b),但是为它分配了第一个容器的值,b的值现在是对a的引用。 Container b = a; 正如预期的那样,当我打印出aA和bA的值时,它们是相同的。 Console.WriteLine(“aA={0},bA={1}”,aA,bA); //aA=1,bA=1 并且,正如预期的那样,当我更改aA的值时,bA的值也会因为它们引用相同的对象而发生变化。 aA = 2; Console.WriteLine(“aA={0},bA={1}”,aA,bA); // aA=2,bA=2 现在我决定尝试使用单个本地对象。 同样,我将整数打包到第一个对象中,并将第一个对象的值分配给第二个对象。 我相信这个对象应该是一个引用类型,所以c和d应该引用同一个对象。 不改变任何东西,它们返回相同的值。 int start = 1; object c = start; object d […]

将值类型捕获到lambda中时是否执行复制?

struct SomeStruct { public int Num { get; set; } } class Program { static Action action; static void Foo() { SomeStruct someStruct = new SomeStruct { Num = 5 }; action = () => Console.WriteLine(someStruct.Num); } static void Main() { Foo(); action.Invoke(); } } 是否创建了lambda时创建的someStruct的副本? Foo返回时是否创建了someStruct的副本? 我可以validation没有发生复制吗? 在C ++中,我实现了复制构造函数并从中进行打印。 该标准的引文将不胜感激。 任何相关的在线文章也是如此。