Tag: 编译时

说服C#编译器在成员返回后执行将停止

我不认为这是目前可行的,或者它是否是一个好主意,但这是我刚才想到的。 我使用MSTest对我的C#项目进行unit testing。 在我的一个测试中,我执行以下操作: MyClass instance; try { instance = getValue(); } catch (MyException ex) { Assert.Fail(“Caught MyException”); } instance.doStuff(); // Use of unassigned local variable ‘instance’ 为了使这段代码编译,我必须在其声明或catch块中为instance赋值。 我可以选择在Assert.Fail之后return ,但这仍然是一种解决方法,而不是编译器只知道在此之后执行无法继续。 Assert.Fail永远不会,据我所知,允许执行继续它,因此instance永远不会没有值。 那为什么我必须给它赋值? 如果我将Assert.Fail更改为类似throw ex ,则代码编译正常,我假设因为它知道exception将禁止执行进入instance将未初始化使用的点。 相反,如果我不希望测试失败,而是标记为不确定,该怎么办? 我可以做一个Assert.Inconclusive而不是Fail ,如果编译器知道之后执行不会继续,那就太好了。 那么运行时与编译时知识的情况是否允许执行在哪里进行? C#是否有理由说某个成员(在这种情况下是Assert.Fail在返回后永远不允许执行? 也许这可能是方法属性的forms。 这会对编译器有用还是不必要的复杂性? 外部unit testing 由于人们[有效]指出这是编写unit testing的愚蠢方式,因此请考虑我在unit testing领域之外的问题: MyClass instance; if (badThings) { someMethodThatWillNeverReturn(); } else […]

创建基于编译器的“字典”的非静态版本,其中键是类型

有一个非常简单的技巧,它创建了一个类似字典的结构,其中键是类型。 该结构的行为类似于Dictionary ,其中键是Type对象,值是相应类型的实例。 这个奇妙的结构和变量或数组一样快,因为“查找”只由编译器/ JITter执行一次,并且正确的值引用被编译到程序中。 public static class MyDict { public static T Value { get; set; } } 您可以像这样使用该结构: MyDict.Value = MyDict.Value.ToString(); 问题是这个“字典”是全球性的。 创建不同字典的唯一方法是创建不同的类。 如何创建一个类似的(最快的“查找”,没有拳击)非静态结构? (没有代码生成。) 简单地说:我希望有多个Dictionary类似的对象,没有查找成本,转换和装箱。

是否可以使用编译时检查类型是否使用Serializable属性进行标记

具体来说,我们使我们的应用程序与Out Of Process会话状态服务器兼容,其中会话中保存的所有类型都必须是可序列化的。 有没有办法在编译时看到放入HttpSessionState的任何类型都标有Seri​​alizable属性。 这个“无效”代码的一些东西 public static void Put( string key, T value ) where T : IsMarkedWitheSerializableAttribute { HttpContext.Current.Session[key] = value; }

如何获取变量的编译时类型?

我正在寻找如何为调试目的获取变量的编译时类型。 测试环境可以简单地再现: object x = “this is actually a string”; Console.WriteLine(x.GetType()); 哪个会输出System.String 。 我怎么能在这里获得编译时类型System.Object ? 我看了一下System.Reflection ,但却失去了它提供的可能性。

使用Intellisense和编译时检查提取reflection的属性名称

好。 所以我有一些代码将winForm上的某些控件映射到对象中的某些属性,以便在数据发生某些事情时对控件执行某些操作。 一切都很好,工作得很好。 不是问题。 问题是,要将项添加到映射中,我调用的函数看起来像: this.AddMapping(this.myControl,myObject,”myObjectPropertyName”); 我遇到的问题是,在编译时很难说出上述行与下面的行之间的区别: this.AddMapping(this.myControl,myObject,”myObjectPropretyName”); 由于最后一个参数是一个字符串,因此没有编译时检查或类似的任何操作会强制字符串本身实际上对应于给定对象上的有效属性名称。 此外,Refactor和“查找所有引用”之类的内容错过了这种引用,当属性名称发生变化时会导致欢闹。 所以我想知道的是,如果有一些方法可以更改函数,那么我传入的内容仍然是以某种方式表示属性名称的字符串,但是编译时会检查实际值是否进入。有人说我可以用表达式树做到这一点,但我已经阅读了它们,似乎没有看到连接。 我喜欢做类似的事情: this.AddMapping(this.myControl,myObject,myObject.myObjectPropertyName); 甚至 this.AddMapping(this.myControl,myObject.myObjectPropertyName); 会很甜蜜! 有任何想法吗?

我可以从csharp中的编译时env变量中创建一个常量吗?

我们使用Hudson来构建我们的项目,Hudson在编译时方便地定义了像“%BUILD_NUMBER%”这样的环境变量。 我想在代码中使用该变量,因此我们可以在运行时记录这是什么构建。 但是我不能做System.Environment.GetEnvironmentVariable,因为那是访问运行时环境,我想要的是这样的: #define BUILD_NUM = %BUILD_NUMBER% 要么 const string BUILD_NUM = %BUILD_NUMBER% 除了我不知道语法。 有人可以指出我正确的方向吗? 谢谢!

在C#中编译时间reflection

我经常编写C#代码,必须使用魔术字符串来表达属性名称。 每个人都知道魔术弦的问题。 它们很难重构,它们没有编译时间检查,并且通常会导致难以诊断的问题。 然而,C#/ .NET 在整个地方使用它们来表示属性/类/方法名称。 这个问题已持续多年和多年,目前唯一可行的解​​决方案是使用表达式树,然后在运行时解析属性名称。 这可以让您获得令人满意的编译时检查,但它使代码复杂化(需要Expression类型的参数), 并且会产生运行时成本。 有没有人知道是否有一个特性考虑因为C#/ .NET添加编译时reflection来克服这个普遍存在的问题? 它似乎是一个很容易的补充,它将是一个非破坏性的变化,它将使许多开发人员受益匪浅。 typeof()运算符已经执行了编译时reflection的forms,因此看起来运算符nameof()(或类似的东西)将非常互补。 此外,有没有人知道这种function的任何潜在问题? 谢谢您的帮助。