我是C#中扩展方法的粉丝,但是没有成功将扩展方法添加到静态类,例如Console.
例如,如果我想向Console添加一个名为'WriteBlueLine'的扩展,那么我可以去:
Console.WriteBlueLine("This text is blue");
Run Code Online (Sandbox Code Playgroud)
我尝试通过添加一个本地的公共静态方法,将Console作为'this'参数...但没有骰子!
public static class Helpers {
public static void WriteBlueLine(this Console c, string text)
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine(text);
Console.ResetColor();
}
}
Run Code Online (Sandbox Code Playgroud)
这没有向Console添加'WriteBlueLine'方法......我做错了吗?或者要求不可能?
显然,您可以this从结构中的任何位置更改值(但不能在类中):
struct Point
{
public Point(int x, int y)
{
this = new Point();
X = x; Y = y;
}
int X; int Y;
}
Run Code Online (Sandbox Code Playgroud)
我以前也没见过这种情况,也从未见过它.为什么一个人想要这样做?Eric Lippert提醒我们,必须证明某个功能是合理的.有什么好的用例可以证明这一点?有什么场景这是非常宝贵的吗?我找不到任何文件1.
此外,对于调用构造函数,已经有一个更好的已知替代语法,因此此功能有时是多余的:
public Point(int x, int y)
: this()
{
X = x; Y = y;
}
Run Code Online (Sandbox Code Playgroud)
C#提供了在函数重载时使用的以下签名特征.
我们知道,重载只考虑参数; 它们的数量和类型,但多态性的目标是根据调用策略提供相同的名称但不同的用法.
如果我有一个包含两个具有相同名称和签名的方法的类,而一个是静态而另一个不是,则C#编译器会抛出错误; "类已经定义了一个名为'foo'的成员,它具有相同的参数类型".对这两种方法的调用将会有所不同; 一个具有对象名称,另一个具有类名称.因此,呼叫策略没有歧义.那为什么会抛出错误?
class Example {
public void foo() { }
public static void foo() { }
}
class Program
{
static void Main(string[] args)
{
Example e = new Example();
e.foo();
}
}
Run Code Online (Sandbox Code Playgroud) 在格式字符串的全文是静态的并且在编译时已知的情况下,丢失的格式字符串参数不应该是编译时错误,或者至少是警告吗?
ReSharper 捕捉到了这一点,但它只是一个带下划线的波浪线。我的印象是这会触发一般的编译时错误:
string x = string.Format("soeuotnh {0}");
Run Code Online (Sandbox Code Playgroud)
有什么方法可以触发此类错误的警告,而不必通过 FxCop 或其他方式运行我的代码?即使是 C/C++ 编译器也会为如此明显的错误触发警告/错误(尽管它们通常不会检查类型安全)。
简介:如果我在构造函数初始化器中创建一个对象,如何保留对它的引用,以便稍后引用它?
细节:
我有一个类(LibBase,下面)需要一个StreamWriter作为其构造参数.我没有源代码LibBase- 它在第三方库中.
public class LibBase
{
public LibBase(System.IO.StreamWriter wtr) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我MyClass从构造函数中派生出来,LibBase并MyClass希望将MyWriter(派生形式StreamWriter)的实例传递给基类.我这样做如下.
public class MyWriter : System.IO.StreamWriter
{
public MyWriter(int n) { ... }
// Contains unmanaged resources
}
public class MyClass : LibBase
{
public MyClass(int n)
: LibBase(new MyWriter(n))
{ }
}
Run Code Online (Sandbox Code Playgroud)
问题是MyWriter需要处理,所以MyClass应该配置它(并实现IDisposable这样做)但MyClass没有对创建的MyWriter实例的引用,所以我不能处理它.构造函数初始化程序的语法似乎不允许我保留引用.
我的解决方案是重新编码 …
我想知道是否有一种方法可以使用名为GenerateRandom() 的方法来扩展字符串类,该方法会生成随机字符串。也许这看起来像
string.CreateRandom();
Run Code Online (Sandbox Code Playgroud)
正如我所读到的,除了创建字符串实例然后调用扩展方法之外,没有其他办法。也许有一个,而且你知道。
感谢您的帮助!