【发布时间】:2017-05-16 14:37:52
【问题描述】:
不知道为什么编译不出来?
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,我会开枪的。 -
@leppie:那是随机的人还是实施它的人?很高兴知道。
-
@leppie 你应该解释为什么:-) 我仍然没有看到关于这个原因的解释。为什么与类不同?
-
作为旁注,即使您使用
foreach (var sss in new List<MyStruct>()),也无法做到这一点 -
@leppie 我发现
struct : IDisposable的一个相当合法的用途是滥用using()以确保使用HtmlTextWriter编写的XML/HTML 标记元素被正确关闭(struct的@987654330 @ 方法使用正确的标记名调用WriteCloseTag- 尽管我的结构是不可变的)。它会生成更易读的代码,类似于呈现的 HTML,因为using的缩进就像它呈现的元素一样。由于 CIL 使用ldloca.s+constrained+callvirt,C# 编译器不会 将结构装箱 - 但我希望它会像foreach那样使用鸭子类型。
标签: c# .net idisposable using