官方解释: ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/csspec/html/vclrfcsharpspec_A.htm # 语言规范 A. 不安全代码如前面几章所定义,核心 C# 语言没有将指针列入它所支持的数据类型,从而与 C 和 C++ 有着显著的区别。作为替代,C# 提供了各种引用类型,并能够创建可由垃圾回收器管理的对象。这种设计结合其他功能,使 C# 成为比 C 或 C++ 安全得多的语言。在核心 C# 语言中,干脆不可能有未初始化的变量、“虚”指针或者超过数组的边界对其进行索引的表达式。这样,以往总是不断地烦扰 C 和 C++ 程序的一系列错误就不会再出现了。尽管实际上对 C 或 C++ 中的每种指针类型构造,C# 都设置了与之对应的引用类型,但仍然会有一些场合需要访问指针类型。例如,当需要与基础操作系统进行交互、访问内存映射设备,或实现一些以时间为关键的算法时,若没有访问指针的手段,就不可能或者至少很难完成。为了满足这样的需求,C# 提供了编写不安全代码的能力。在不安全代码中,可以声明和操作指针,可以在指针和整型之间执行转换,还可以获取变量的地址,等等。在某种意义上,编写不安全代码很像在 C# 程序中编写 C 代码。无论从开发人员还是从用户角度来看,不安全代码事实上都是一种“安全”功能。不安全代码必须用修饰符 unsafe 明确地标记,这样开发人员就不会误用不安全功能,而执行引擎将确保不会在不受信任的环境中执行不安全代码。
string str="";
public test()
{
string str="";
....
str+="your date"
}
}
我写一个类.
首先定义一个类型。string str;因为这个str在这个类里都要用到。然后我用一个选择语句。来给str赋值.
{
string str;
switch(XX.Text)
{ case "A":
str="select * from A where";
break;
case "B":
str="select * from A where";
break;
case "C":
str="select * from A where";
:
:
default:
break;
}
//str已赋值.
SqlDataAdapter adapter=new SqlDataAdapter(str,conn);
//此处用到str 的赋值.
:
:
}
//完毕运行。错误提示: 使用未赋值的局部变量"str";
偶不用管它。继续运行。程序成功。 为了不让它有错误提示。我给str在刚开始定义时随便赋个值 。
string str="a";//换掉前面的string str;
运行。正确;
使我程序的str无缘无姑的多了个赋值。我才不要了。C语言中这样定义,它也没错呀。为什么在C#(ASP)这样定义就不行了呢? 是.net 的漏洞还是我错了。请教各位。有没有遇到跟小吓一样问题。只因想多了解了解。特提此问 .
所以会提出警告错误,如果要避免这种情况 又不想在刚开始定义时随便赋个值,
就要保值在switch语句中所有的可能都要给str赋值(补充 default赋值)你觉得呢?
却是,如你所说。要给dafault赋值。但是有时我这样定义也会出现类似的问题: { string str;
if(...)
{ str=...;
}
if(....)
{
str=...;
}
if(....)
{
str=....;
}
SqlCommand comm=new SqlCommand(str,conn);
:
: }它也会出现类似的问题? 请教各位。有为何解了。
在.net中,有一个很重要的特性就是内存安全(相对于unsafe)。另外,在C#中一个引用变量的功能就相当于一个指针,它指向托管空间中某个对象的首地址。但是,在一个引用变量指向一个对象时,.Net会做相关的检查以保证这样的引用不会产生溢出,比如引用变量的类型与对象的类型是不是匹配。很明显这样的检查工作大部分是可以在程序编译时就可以完成的。而当一个变量没有赋任何值的情况下(连null都不是),程序就使用了这个变量,这样的操作是于前面说的内容安全是相悖的。
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/csspec/html/vclrfcsharpspec_A.htm
# 语言规范 A. 不安全代码如前面几章所定义,核心 C# 语言没有将指针列入它所支持的数据类型,从而与 C 和 C++ 有着显著的区别。作为替代,C# 提供了各种引用类型,并能够创建可由垃圾回收器管理的对象。这种设计结合其他功能,使 C# 成为比 C 或 C++ 安全得多的语言。在核心 C# 语言中,干脆不可能有未初始化的变量、“虚”指针或者超过数组的边界对其进行索引的表达式。这样,以往总是不断地烦扰 C 和 C++ 程序的一系列错误就不会再出现了。尽管实际上对 C 或 C++ 中的每种指针类型构造,C# 都设置了与之对应的引用类型,但仍然会有一些场合需要访问指针类型。例如,当需要与基础操作系统进行交互、访问内存映射设备,或实现一些以时间为关键的算法时,若没有访问指针的手段,就不可能或者至少很难完成。为了满足这样的需求,C# 提供了编写不安全代码的能力。在不安全代码中,可以声明和操作指针,可以在指针和整型之间执行转换,还可以获取变量的地址,等等。在某种意义上,编写不安全代码很像在 C# 程序中编写 C 代码。无论从开发人员还是从用户角度来看,不安全代码事实上都是一种“安全”功能。不安全代码必须用修饰符 unsafe 明确地标记,这样开发人员就不会误用不安全功能,而执行引擎将确保不会在不受信任的环境中执行不安全代码。