首页 新闻 会员 周边

为什么C#中的变量在被赋值之前都不能使用

0
悬赏园豆:20 [已关闭问题]

C#中的变量在未被赋值的情况下被使用的话会出现语法错误,这是怎么回事,是因为C#有某种保护机制还是因为不给变量赋值就不为其分配内存空间

世杰的主页 世杰 | 初学一级 | 园豆:180
提问于:2010-02-20 10:23
< >
分享
其他回答(6)
0

当你申明变量的时候就会为它在内存中分配内存空间,照我个人理解就是你说的C#有保护机制,如果使用未赋值的变量就会导致程序出错,所以在编译的时候就会出现语法错误

Ou lei | 园豆:619 (小虾三级) | 2010-02-20 10:48
有何证明呢?
支持(0) 反对(0) 世杰 | 园豆:180 (初学一级) | 2010-02-20 10:50
0

那是因为它的语法规则规定了 这样写是错的。为什么是错的呢,因为它没有为变量分配空间,在使用这个变量的过程中可能会出现异常,所以.平台提示你.你是错的

邢少 | 园豆:10926 (专家六级) | 2010-02-20 10:54
很感谢您的答案,你的想法与我的不谋而合,但是您的答案说的不够透彻
支持(0) 反对(0) 世杰 | 园豆:180 (初学一级) | 2010-02-20 17:43
0

你媳妇还没有怀孕的时候,你就可以先给孩子起名字,但你会去用这个名字买房吗

查尔斯 | 园豆:3832 (老鸟四级) | 2010-02-20 11:04
很感谢您的答案,但是您的答案与我的问题有点偏离,因为两者之间并没什么可比性
支持(0) 反对(0) 世杰 | 园豆:180 (初学一级) | 2010-02-20 17:42
0

对于值类型的话,没有这个限制吧,没有初始化的话,自动默认值;

对于引用类型的话,定义的时候就是一个引用,还没有分配内存空间,所以不能使用,至少也得=null才行,微软也是为你好

Virus-BeautyCode | 园豆:1619 (小虾三级) | 2010-02-20 15:01
很感谢你的答案,但是值类型在被赋值之前除了被赋值之外不能有任何的访问
支持(0) 反对(0) 世杰 | 园豆:180 (初学一级) | 2010-02-20 17:34
0

是因为C#编译器的C#保护机制。

定义变量时内存已经分配了,只不过没有初始化,C#编译器强制要求变量在使用前都必须初始化。

drin | 园豆:225 (菜鸟二级) | 2010-02-20 15:29
很感谢您的答案,但是我很希望能有一个说明变量被分配内存空间的例子
支持(0) 反对(0) 世杰 | 园豆:180 (初学一级) | 2010-02-20 17:36
0

C#是有保护机制,在使用变量的时候必须赋值。你如果想使用未赋值的变量的话,那么不能在一个类中使用。给你两个简单的类:

    public class Class1
    {
        public string s;

        public int a;
    }

    public class Test
    {
        public static void Main()
        {
            Class1 c1 = new Class1();

            int inta = c1.a;
            string str1 = c1.s;

            Console.WriteLine(inta);
            Console.WriteLine(str1);

            Console.ReadLine();
        }
    }

石云 | 园豆:205 (菜鸟二级) | 2010-02-20 16:28
很感谢您的答案,类中声明的变量在类被创建实例的时候会被系统自动的赋初始值,因此您说的没错,的确不能在一个类中使用。但是C#支持在类的数据成员声明的同时为其赋初始值,假如我为类Class1的成员s赋赋初始值,这个成员还是不能被使用
支持(0) 反对(0) 世杰 | 园豆:180 (初学一级) | 2010-02-20 17:40
首先,要区分值类型和引用类型。在类中声明变量时,只是在堆栈中为其分配了一块内存,这样对于值类型来说,就相当于赋值了,但是对于引用类型来说,在声明时,只是为引用变量在堆栈中分配了内存,至于引用变量实际的存储位置,是在堆中。我们在程序中使用引用类型时,是通过引用变量指向堆中的某块内存地址。因此,说到变量声明是否可以替代初始化,对于值类型来说,可以这样理解,对于引用类型来说,是不正确的。
支持(0) 反对(0) 李潘 | 园豆:319 (菜鸟二级) | 2010-02-23 00:30
再次感谢你的答案。我明白你的意思,你的意思是只要为变量分配了一块内存,就算是为变量赋值了。但我并不完全赞同你的这一看法,你只是说为变量赋初始值(我认为你对变量的认识可能与我有些不同,你可能认为变量只是个名称,但我认为变量其实等同于一块内存),并没有说给系统为变量分配的内存赋初始值,其实赋值的本质我认为是改变内存的物理状态,如果我们在某个程序中声明一个变量后未对其做任何赋值操作,那么这个变量并不算被赋了值,虽然这个变量被分配了内存空间,但其内存空间的物理状态在该程序运行过程中并未发生任何改变(注意:系统并不会为这块内存空间赋默认值,因为在C#中,系统只是直接拿了别的程序在声明变量时用过的内存来给这个变量分配内存)。但是,这里我做了变量被声明时就被分配内存空间的假设,当然,你也支持这个假设
支持(0) 反对(0) 世杰 | 园豆:180 (初学一级) | 2010-02-25 14:30
0

这是个很好的问题,比较细致,值得好好记忆下。

当我们在声明一个变量的时候,此时会进行内存分配(比如int i;此时会在堆栈上分配4个字节),也就是在进行变量声明时会进行内存的分配,以保存该类型对应的值。至于我们声明一个变量后不进行赋值便使用,此时是编译器会报错,错误提示是 使用了一个未赋值的变量.在.NET中有一个概念应该是大家都很熟悉的,那就是类型安全。何为类型安全,这个提问应该说是个最好的例证。如果有注意,在.NET编译器中,对未赋值的变量进行使用的时候,编译器会提示这是个错误,而在其他语言编译器中对未赋值变量的使用提示的是警告。

...其实说了这么多,个人觉得还是不够权威性。故索性直接查阅《C#语言规范》,在规范中一句话道破天机"一个局部变量通常通过指定的类型名称和说明符来定义,它指定了变量名称和一个任意的初始值<A local variable is defined by specifying a type name and a declarator that specifies the variable name and an optional initial value>(ECMA-334 C# 8.3 Variables and parameters)".看完这句话,这个问题我觉得也不用在质疑了...

 另外正对石云 所写实例,补充说一点:C#中使用两种方式保证类型安全:

一、变量是类或者结构中的字段,如果没有进行显示赋值,在默认状态下创建相应变量时,其值为对应类型默认值。

二、方法的局部变量必须在代码中显示初始化,之后才可以在语句中进行使用。

西越泽 | 园豆:10775 (专家六级) | 2010-02-27 03:03
但是我在编程中把全局变量给声明了:extern unsigned char tu1_320240[]; 这是一个未被赋值数组,但是应用时Paint_Bmp(0, 0, 320, 240,tu1_320240);还是出现错误 Paint_Bmp是一个函数 你们知道为什么吗?
支持(1) 反对(0) wenshan231 | 园豆:200 (初学一级) | 2010-04-15 21:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册