Tag: 静态

为什么非静态类中的静态方法不能作为扩展方法?

可能重复: 扩展方法要求类是静态的 在.NET中: 为什么非静态类中的静态方法不能作为扩展方法?

静态构造函数会导致性能开销吗?

最近在dotnetpearls.com上的一篇文章中读到这里的说法,静态ctors采取了大量的性能。 无法理解为什么?

为什么通过inheritance类型访问静态成员是有用的?

我很高兴C#不允许你访问静态成员,就像’他们是实例成员一样。 这避免了Java中的常见错误: Thread t = new Thread(..); t.sleep(..); //Probably doesn’t do what the programmer intended. 另一方面,它允许您通过’派生类型访问静态成员。 除了运算符(它可以让你免于编写演员表),我无法想到任何实际上有用的情况。 事实上,它积极鼓励错误,例如: // Nasty surprises ahead – won’t throw; does something unintended: // Creates a HttpWebRequest instead. var ftpRequest = FtpWebRequest.Create(@”http://www.stackoverflow.com”); // Something seriously wrong here. var areRefEqual = Dictionary.ReferenceEquals(dict1, dict2); 当我通过不熟悉的API搜索时,我个人不断地反复提出类似的错误(我记得从表达树开始;我在编辑器中点击BinaryExpression.并且想知道为什么地球上的IntelliSense提供MakeUnary作为选项)。 在我的(短视)意见中,此function: 不减少冗长; 程序员必须以某种方式指定类型名称(当访问当前类型的inheritance静态成员时,不包括运算符和大小写)。 鼓励上面提到的错误/误导性代码。 可以向程序员建议C#中的静态方法表现出某种“多态性”,而不是。 (次要)在重新编译时引入’沉默’,可能是无意的重新绑定可能性。 (国际海事组织,运营商是一个特殊情况,值得他们自己讨论。) […]

为什么使用System.Runtime.Caching或System.Web.Caching Vs静态变量?

长时间听众 – 第一次来电。 我希望得到一些建议。 我一直在阅读.net中的缓存 – 包括System.Web.Caching和System.Runtime.Caching。 我想知道我可以获得什么额外的好处与简单地创建一个带锁定的静态变量。 我目前的(简单的)缓存方法是这样的: public class Cache { private static List _allCategories; private static readonly object _lockObject = new object(); public static List AllCategories { get { lock (_lockObject) { if (_allCategories == null) { _allCategories = //DB CALL TO POPULATE } } return _allCategories; } } } 除了到期(我不希望它到期)我不知道使用内置缓存的好处是什么。 也许对于不适用于我的更复杂的缓存方案有好处 […]

C#:所以如果静态类是存储全局状态信息的不良做法,那么提供相同方便性的好方法是什么?

我一直注意到静态类在用于存储全局信息方面在SO上获得了很多不好的代表。 (而且全局变量一般被嘲笑)我只想知道下面的例子有什么好的选择…… 我正在开发一个WPF应用程序,并且根据当前登录用户的ID过滤了从我的数据库中检索到的数据的许多视图。 同样,我的应用中的某些点应该只能被视为“管理员”的用户访问。 我目前正在静态类中存储loggedInUserId和isAdmin bool。 我的应用程序的各个部分需要这些信息,我想知道为什么它在这种情况下不理想,以及替代品是什么。 起床和跑步似乎非常方便。 我唯一可以想到的替代方法是使用IoC容器将Singleton实例注入需要此全局信息的类中,然后类可以通过其接口与之通信。 然而,这是否过度/导致我陷入分析瘫痪? 提前感谢您的任何见解。 更新 因此,我倾向于通过IoC进行dependency injection,因为它可以更好地提供可测试性,因为我可以交换一个服务,如果需要,可以使用模拟提供“全局”信息。 我想剩下的是注入的对象是单身还是静态。 🙂 如果等待查看是否还有其他讨论,请问问Mark的答案。 我不认为这是正确的方式。 我只是想看到一些可以启发我的讨论,因为似乎有很多“这是坏的”,“这是坏的”,在没有任何建设性替代方案的情况下对某些类似问题的陈述。 更新#2所以我选择了罗伯特的答案,因为它是一个很好的选择(我认为替代方案是一个奇怪的词,可能是One True Way,因为它是内置于框架中)。 它并没有强迫我创建一个静态类/单例(尽管它是线程静态的)。 唯一让我感到好奇的是,如果我必须存储的“全局”数据与用户身份validation无关,那将如何处理。

C#接口静态方法调用generics

有没有一种简单的方法来实现它,如果可能的话,不需要实例化对象: interface I { static string GetClassName(); } public class Helper { static void PrintClassName() where T : I { Console.WriteLine(T.GetClassName()); } }

静态构造函数在实例构造函数之后调用?

亲爱的,这个问题已经被问过了 ,但是答案中没有解释我看到的问题。 问题: C#编程指南说: 静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作。 在创建第一个实例或引用任何静态成员之前会自动调用它。 特别是,在创建任何类的实例之前调用静态构造函数。 (这不能确保静态构造函数在创建实例之前完成,但这是另一回事。) 我们来看一下示例代码: using System; public class Test { static public Test test = new Test(); static Test() { Console.WriteLine(“static Test()”); } public Test() { Console.WriteLine(“new Test()”); } } public class Program { public static void Main() { Console.WriteLine(“Main() started”); Console.WriteLine(“Test.test = ” + Test.test); Console.WriteLine(“Main() finished”); } } […]

在C#中初始化静态变量内联或静态构造函数的差异

我想知道初始化内联静态成员有什么区别,如: class Foo { private static Bar bar_ = new Bar(); } 或者在静态构造函数中初始化它,如: class Foo { static Foo() { bar_ = new Bar(); } private static Bar bar_; }

如何使用reflection获取C#静态类属性的名称?

我想创建一个C#Dictionary,其中key是类中静态属性的字符串名称,value是属性的值。 给定名为MyResources.TOKEN_ONE的类中的静态属性,如何获取属性的名称而不是其值? 我只关心属性名称的末尾部分(例如“TOKEN_ONE”)。 我编辑过这个,提到我不想映射字典中的所有属性值,只是该类中所有内容的一小部分。 所以假设我想获得单个属性的名称。 给定MyResources.TOKEN_ONE,我想回到“MyResources.TOKEN_ONE”或只是“TOKEN_ONE”。 这是一些示例代码,显示了我正在尝试做的事情。 我需要属性名称,因为我正在尝试生成一个javascript变量,其中我将属性名称映射到变量名称,将属性值映射到变量值。 例如,我希望C#Dictionary生成如下所示的行: var TOKEN_ONE =“一个”; using System; using System.Collections.Generic; namespace MyConsoleApp { class Program { static void Main(string[] args) { Dictionary kvp = new Dictionary(); // How can I use the name of static property in a class as the key for the dictionary? // For example, I’d […]

为什么C#运算符重载必须是静态的?

为什么C#要求运算符重载是静态方法而不是成员函数(如C ++)? (也许更具体地说:这个决定的设计动机是什么?)