当前位置:编程学习 > C#/ASP.NET >>

为什么using语句内的变量不能修改?

如果我有以下代码:

using(S s = new S())
{
                s.x = 2;
                s.y = 3;
}

编译器会提示我Cannot modify members of 's' because it is a 'using variable'
这是为什么呢? 如果一个变量声明了就不能再修改了,那应该有readonly/const之类的修饰啊,为什么using了就不能修改了? --------------------编程问答-------------------- 如果S仅是一个对象,你这样使用是没有什么意义的,using一般用天连接数据,然后对数据库中的对象操作

--------------------编程问答-------------------- 用using指定的对象在using块内是只读的,所以不能修改它 --------------------编程问答-------------------- 如果是普通的引用对象,自然是可以修改的。

可能你的 S 是个 struct。你应该给出更加详尽的代码。 --------------------编程问答-------------------- 类是可以修改的;
你的S难道是结构体吗? --------------------编程问答--------------------
引用 3 楼 sp1234 的回复:
如果是普通的引用对象,自然是可以修改的。

可能你的 S 是个 struct。你应该给出更加详尽的代码。


你说的对,这个S就是一个struct>
难道C#有规定说,using里面只能修改class不能修改struct?
这样规定的意义是什么呢?

谢谢。 --------------------编程问答--------------------
引用 5 楼 u013192827 的回复:
Quote: 引用 3 楼 sp1234 的回复:

如果是普通的引用对象,自然是可以修改的。

可能你的 S 是个 struct。你应该给出更加详尽的代码。


你说的对,这个S就是一个struct>
难道C#有规定说,using里面只能修改class不能修改struct?
这样规定的意义是什么呢?

谢谢。


using关键字包含的对象是需要实现IDisposable接口的,否则因为无法释放资源而不能使用USING声明,
结构体的话,应该是不能用using的。至于为什么不能修改,就不知道了。同求大神说明。。
++++或许是因为结构体无法用using声明导致.....+++++ --------------------编程问答-------------------- 结构体是值类型,类是引用类型
所以在只读状态下(比如using和foreach内部)是不可以修改的. --------------------编程问答-------------------- 这是编译器为了防止你犯错而做出的限制。 --------------------编程问答-------------------- 你可以自己测一下:
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (S s = new S())
            {
                Console.WriteLine(s);
                s.x = 2;
                s.y = 3;
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }
    }

    public class S : IDisposable
    {
        public int x { get; set; }
        public int y { get; set; }

        public void Dispose()
        {
        }

        public override string ToString()
        {
            return string.Format("x={0}, y={1}", x, y);
        }
    }
}
--------------------编程问答-------------------- 然后,你可以把
public class S : IDisposable
变为
public struct S : IDisposable

看看c#编译器给你什么反馈。 --------------------编程问答--------------------
引用 5 楼 u013192827 的回复:
Quote: 引用 3 楼 sp1234 的回复:

如果是普通的引用对象,自然是可以修改的。

可能你的 S 是个 struct。你应该给出更加详尽的代码。


你说的对,这个S就是一个struct>
难道C#有规定说,using里面只能修改class不能修改struct?
这样规定的意义是什么呢?

谢谢。


正如#8楼所说,编译器防止你滥用struct而犯错。因为struct是随时都在拷贝复制对象的,而不是真正高效率地引用对象的。而using这类代码,要求在using(...)这个部分对引用的对象进行处理,而避免将来多你拷贝的副本进行处理。 --------------------编程问答-------------------- 不会吧,我印象中,我有不少代码是修改对象的属性的。 --------------------编程问答--------------------
引用 7 楼 bf6543 的回复:
结构体是值类型,类是引用类型
所以在只读状态下(比如using和foreach内部)是不可以修改的.


也就是using一个引用的时候,lock是引用本身,而不是引用的对象。lock了一个结构体就是lock了结构体本身。
明白了!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,