我想知道为什么它不能编译?
public static void Main(string[] args)
{
using (MyStruct sss = new MyStruct())
{
sss.s = "fsdfd";// Cannot modify members of 'sss' because it is a 'using variable'
//sss.Set(12); //but it's ok
}
}
public struct MyStruct : IDisposable
{
public int n;
public string s;
public void Set(int n)
{
this.n = n;
}
public void Dispose()
{
Console.WriteLine("dispose");
}
}
更新:但它运行得完美。为什么?
public static void Main(string[] args)
{
using (MyClass sss = new MyClass())
{
sss.Field = "fsdfd";
}
}
public class MyClass:IDisposable {
public string Property1 { get; set; }
public string Field;
public void Method1 (){}
public void Dispose()
{
Console.WriteLine("dispose class");
}
}
struct : IDisposable
有一个相当合理的用途,那就是滥用using()
以确保使用HtmlTextWriter
写入的 XML/HTML 标记元素被正确关闭(struct
的Dispose
方法使用正确的标记名称调用WriteCloseTag
- 尽管我的结构体是不可变的)。这样可以生成更易读的代码,类似于呈现的 HTML,因为using
的缩进方式就像它正在渲染的元素一样。C# 编译器不会将结构体装箱,因为 CIL 使用ldloca.s+constrained+callvirt
,但我希望它能像foreach
一样使用鸭子类型。 - Dai