Tag: C#的

为什么在C中需要volatile?

为什么在C中需要volatile ? 它是干什么用的? 它会做什么?

C指针指针如何工作?

C指针指针如何工作? 你什么时候使用它们?

如何从gcc的C / C ++源代码获得汇编输出?

如何做到这一点? 如果我想分析一下如何编译,我将如何获得发出的汇编代码?

何时使用引用与指针

我理解指针和引用的语法和一般语义,但是我应该如何决定何时在API中使用引用或指针? 当然,有些情况需要一个或另一个( operator++需要一个引用参数),但一般来说,我发现我更喜欢使用指针(和指针),因为语法清楚,variables正在被破坏性地传递。 例如在下面的代码中: void add_one(int& n) { n += 1; } void add_one(int* const n) { *n += 1; } int main() { int a = 0; add_one(a); // Not clear that a may be modified add_one(&a); // 'a' is clearly being passed destructively } 随着指针,它总是(更)明显是怎么回事,所以对于清晰度是一个大问题的API和类似的指针不比引用更适合? 这是否意味着引用只能在必要时使用(如operator++ )? 有没有任何性能问题与其中一个? 编辑(OUTDATED): 除了允许NULL值和处理原始数组外,似乎select归结为个人偏好。 我已经接受了下面的引用Google的C ++风格指南的答案,因为他们提出了“引用可能会令人困惑,因为它们具有值语法,但是指针语义”。 由于需要额外的工作来清理不应该为NULL的指针参数(例如, […]

const和readonly有什么区别?

const和readonly什么区别,你用另一个呢?

在C#或.NET中见过的最奇怪的angular落案例是什么?

我收集了几个angular落案例和脑筋急转弯 ,总是想听到更多。 该页面只包含C#语言的位和bob,但是我也发现了一些有趣的.NET内容。 例如,下面是一个不在页面上,但我觉得不可思议的: string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y)); 我希望打印假 – 毕竟,“新”(带引用types) 总是创build一个新的对象,不是吗? C#和CLI的规范表明它应该。 那么,不是在这个特殊情况下。 它打印为True,并在我testing过的每个版本的框架上完成。 (我还没有尝试单声道,诚然…) 只是要清楚,这只是我所寻找的一个例子 – 我并不特别寻找这种古怪的讨论/解释。 (这和正常的string实际上不一样;特别是当调用构造函数时,string实际上通常不会发生。)我真的在要求类似的奇怪行为。 还有其他gem潜伏在那里?

为什么VB.Net中的每个表单都有一个默认的实例,但在C#中却没有?

我只是好奇,知道有(名称)属性,它代表了表单类的名称。 此属性在名称空间内用于唯一标识Form是实例的类,在Visual Basic的情况下,用于访问表单的默认实例。 现在,这个默认实例来自哪里,为什么不能C#有一个等效的方法。 也例如在C#中显示一个表单,我们做这样的事情: // Only method Form1 frm = new Form1(); frm.Show(); 但在VB.Net中,我们有两种方法来做到这一点: ' First common method Form1.Show() ' Second method Dim frm As New Form1() frm.Show() 我的问题来自这第一种方法。 什么是Form1 ,它是Form1的实例还是Form1类本身? 现在,如上所述,表单名称是VB.Net中的Default实例。 但是我们也知道Form1是一个在Designer定义的类,所以实例和类名的名字是如何相同的呢? 如果Form1是一个类,则不存在名为Show()的(Static \ Shared)方法。 那么这个方法从哪里来? 他们在生成的IL中有什么不同? 最后,为什么C#没有这个相同的function呢?

为什么XML-Serializable类需要一个无参数的构造函数

我在写代码来做Xml序列化。 具有以下function。 public static string SerializeToXml(object obj) { XmlSerializer serializer = new XmlSerializer(obj.GetType()); using (StringWriter writer = new StringWriter()) { serializer.Serialize(writer, obj); return writer.ToString(); } } 如果参数是没有无参数构造函数的类的实例,则会抛出exception。 未处理的exception:System.InvalidOperationException:CSharpConsole.Foo不能被序列化,因为它没有无参数的构造函数。 System.Xml.Serialization.Type.Class.Model上的System.Xml.Serialization.TypeDesc.CheckSupported()在types,成员信息源,布尔directReference, (System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(typestypes,XmlRootAttribute根,stringdefaultNamespace)在System.Xml.Serialization.XmlSerializer..ctor(typestypes,stringdefaultName空间)在System.Xml.Serialization。 XmlSerializer..ctor(typestypes) 为什么必须有一个无参数的构造函数才能让xml序列化成功呢? 编辑:感谢cfeduke的答案。 无参数的构造函数可以是私有的或内部的。

为什么C和C ++编译器在从不执行的时候,允许函数签名中的数组长度?

这是我在学习期间发现的: #include<iostream> using namespace std; int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; } 所以在variablesint dis(char a[1]) , [1]似乎什么都不做,不起作用 所有,因为我可以使用a[2] 。 就像int a[]或char *a 。 我知道数组的名称是一个指针,如何传达一个数组,所以我的难题不在于这个部分。 我想知道的是为什么编译器允许这种行为( int a[1] )。 还是有其他的含义,我不知道?

为什么协变和逆变不支持价值types

IEnumerable<T>是co-variant,但不支持值types,只是引用types。 下面的简单代码编译成功: IEnumerable<string> strList = new List<string>(); IEnumerable<object> objList = strList; 但是从string为int会得到编译错误: IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList; 原因在MSDN中解释: 差异仅适用于参考types; 如果为变体types参数指定值types,则该types参数对于生成的构造types是不变的。 我search了一下,发现有些问题提到了原因是值types和引用types之间的装箱 。 但是,为什么拳击就是这个原因,这并不能说明我的心意? 有人能给一个简单和详细的解释,为什么协变和逆变不支持价值types, 拳击如何影响这个?