为什么C#不支持类/方法级别的const?

我一直想知道为什么C#不支持类或方法级别的const 。 我知道Jon Skeet长期以来一直希望支持不变性,并且我认为使用函数const的C ++语法可以帮助实现这一点。 通过在类级别添加const关键字,我们将获得全面支持。 现在,我的问题是,C#团队没有开发出这种支持的原因是什么? 我想可以通过编译时检查或通过属性创建所有内容,而无需更改CLR。 我不介意代码能够通过reflection覆盖const行为。 想象一下: const class NumberContainer { public int Number { get; } } ..这样的类只能在构造时填充,所以我们需要一个构造函数来接受一个int。 另一个例子是方法级别的const: public int AddNumbers(NumberContainer n1, NumberContainer n2) const { return n1.Number + n2.Number; } const级方法不应该能够改变它们自己的类中的状态或传递给它们的引用类型的实例。 此外,const级函数只能在其范围内调用其他const级函数。 我不确定lambdas和代表是否会使一切都太难(或不可能)实现,但我确信有更多语言和编译器设计经验的人可以告诉我。 正如Steve B在评论中指出的那样, readonly的存在使得事情变得更复杂,因为const和readonly在runtime期间接近相同,但是在编译时不能确定readonly值。 我想我们可以有const和readonly级别,但这可能太混乱了? 那么,没有实现这个的原因是什么? 可用性问题(理解C ++中的常量通常对新用户来说很难),语言设计问题(无法完成)或仅仅是优先级问题(不变性的时代 – 嗡嗡声已经结束)。

在c#System.Drawing中使用Alpha掩码?

我正在尝试使用System.Drawing.Graphics对象绘制带有源Bitmap和alpha蒙版Bitmap的图像。 目前我循环X和Y并使用GetPixel和SetPixel将源颜色和掩码alpha写入第三个Bitmap ,然后渲染它。 然而,这是非常低效的,我想知道是否有更快的方法来实现这一目标? 我之后的效果看起来像这样: 网格图案代表透明度; 你可能知道这一点。

字典上.NET二进制序列化的奇怪行为

我在.NET的二进制序列化中遇到了一个奇怪的行为,至少在我的期望中。 加载的Dictionary所有项目都将在OnDeserialization回调后添加到其父项。 相反, List则采用另一种方式。 这在真实世界的存储库代码中可能非常烦人,例如,当您需要向字典项添加一些委托时。 请检查示例代码并观察断言。 这是正常的行为吗? [Serializable] public class Data : IDeserializationCallback { public List List { get; set; } public Dictionary Dictionary { get; set; } public Data() { Dictionary = new Dictionary { { “hello”, “hello” }, { “CU”, “CU” } }; List = new List { “hello”, “CU” }; } public […]

做强类型ASP.NET MVC会话的更好方法

我正在开发一个ASP.NET MVC项目,并希望使用强类型的会话对象。 我已实现以下Controller派生类来公开此对象: public class StrongController : Controller where _T : new() { public _T SessionObject { get { if (Session[typeof(_T).FullName] == null) { _T newsession = new _T(); Session[typeof(_T).FullName] = newsession; return newsession; } else return (_T)Session[typeof(_T).FullName]; } } } 这允许我为每个控制器定义一个会话对象,这符合控制器隔离的概念。 是否有更好/更“正确”的方式,也许是微软正式支持的方式?

C#中快速素性测试的示例代码

可能重复: 最快的素数测试算法 希望参考C#中快速素性测试的示例代码,最好使用BigInteger或其他可变大小类型。

C#静态类为何使用?

可能重复: 何时在C#中使用静态类 我将我的类设置为静态很多,但我不确定何时使用静态或不使用静态或不同之处。 有人可以解释一下吗?

在c#中获取字段的名称

鉴于此课程: public class MyClass { public int MyField {get; set;} } 我如何能够在代码中提取MyField的名称? 例如,我可以像这样得到类的名称 typeof(MyClass).Name 我该如何为该领域做类似的事情? 问题的原因是我希望这个特定的代码能够抵抗名称的重构。 编辑:有耐力我的意思是我希望呼叫站点的代码在字段名的变化面前是健壮的。 我有一些使用字段名称的字符串表示的东西。 对不起的措辞很糟糕。 我没有包含呼叫站点代码以保持问题清洁,而不是徘徊在有关呼叫站点代码性质的其他讨论中。

将大型MFC应用程序迁移到WPF / .NET有哪些技巧?

我目前正在开发一个非常大的传统MFC MDI应用程序。 它有大量的UI元素 – 可停靠的工具栏,自定义树控件,上下文菜单等。它是一个图像处理应用程序,因此主视图使用DirectX和OpenGL自我渲染。 该产品大约有10年的历史,其中一个优先事项是更新它的外观和感觉。 知道微软在提供C ++ / MFC和.NET之间的互操作性方面做得很好,我认为以递增方式迁移代码库是有意义的。 我现在正在努力的是从哪里开始。 一种方法是使用WPF删除MFC框架并尽可能多地重用C ++代码。 这将让我们最大限度地发挥WPF架构的优势,但这将意味着一个漫长的开发阶段,直到我们再次完全正常运行。 另一种方法是用它们的WPF对应物一次替换一个MFC控件。 这将允许我们以增量方式工作。 我对这种方法的关注是,这意味着托管和非托管代码之间会有很多连接点,我不知道从哪里开始替换主菜单和工具栏等内容。 或者我还有其他选择吗? 任何有关此主题的信息的建议或链接将不胜感激。 更新: DavidK提出了一些很好的问题,所以我添加了这背后的动机。 1)产品的未来发展 该产品仍在积极开发中,并定期添加新function。 我认为尝试慢慢迁移到C#/ WPF会很有意义。 在我使用C#/ WPF的有限经验中,我发现在C ++ / MFC中工作效率会提高。 我们用WPF获得的另一件大事就是能够利用多头系统。 MFC应用程序仅限于单个顶级框架,因此很难利用多个监视器。 2)员工保留和招聘 找到愿意使用MFC的开发人员越来越难了。 对于当前开发人员的职业发展而言,接触新技术也很重要。

获取类实现的generics接口的类型参数

我有一个通用接口,比如IGeneric。 对于给定的类型,我想找到一个类通过IGeneric实现的generics参数。 在这个例子中更清楚: Class MyClass : IGeneric, IGeneric, IDontWantThis { … } Type t = typeof(MyClass); Type[] typeArgs = GetTypeArgsOfInterfacesOf(t); // At this point, typeArgs must be equal to { typeof(Employee), typeof(Company) } GetTypeArgsOfInterfacesOf(Type t)的实现是什么? 注意:可以假设GetTypeArgsOfInterfacesOf方法是专门为IGeneric编写的。 编辑:请注意我特别询问如何从MyClass实现的所有接口中过滤掉IGeneric接口。 相关: 确定类型是否实现了通用接口

使用’var’和’dynamic’时的exception

我在Anomaly上碰到了一点,这是第一次使用var关键字我。 采用这种非常简单的方法 public static Int32? GetNullableInt32(Int32 num) { return new Nullable(num); } 现在我们可以使用dynamic参数调用此方法,一切都将按预期工作。 public static void WorksAsAdvertised() { dynamic thisIsAnInt32 = 42; //Explicitly defined type (no problems) Int32? shouldBeNullableInt32 = GetNullableInt32(thisIsAnInt32); Console.Write(shouldBeNullableInt32.HasValue); } 但是,通过使用隐式类型声明shouldBeNullableInt32 ,结果远非我所期望的。 public static void BlowsUpAtRuntime() { dynamic thisIsAnInt32 = 42; //Now I’m a dynamic{int}… WTF!!! var shouldBeNullableInt32 = GetNullableInt32(thisIsAnInt32); //Throws a […]