声明和初始化之间的区别
Difference between declaring and initializes
我对 C# 和一般编程还很陌生,我想知道简单声明与初始化之间的区别。
例如,如果我使用 String.Split()
方法,在文档中它说它 returns 一个带有分隔字符的数组,但为什么我不能访问该数组?我必须做类似的事情:
string [] array = mystring.Split()
有没有办法处理只声明但未初始化的东西?对于仅声明的事物(变量、数组等),在运行时会发生什么?
谢谢。
您通过声明变量的类型和名称来声明变量:
string[] array;
你通过给它初始值来初始化它:
string[] array; // declare
array = mystring.Split(); // initialize
在 c# 中,与在许多其他编程语言中一样,您可以将两个操作组合到一个代码行中:
string[] array = mystring.Split();
当你对局部变量这样做时,考虑使用 var
而不是在声明中显式地使用变量的类型,但只有在变量的类型可以很容易地从正确的推导出来的情况下赋值运算符的手边:
var list = new List<int>(); // best.
var array = mystring.Split(); // still quite good.
var myVar = SomeClass.SomeMethodThatWeDoNotKnow(); // not so good...
这样做的原因是,每个阅读代码的人都清楚 list
是 List<int>
,而您必须知道 string.Split return 是什么知道 array
是一个字符串数组,你需要实际将鼠标悬停在 var
关键字上才能知道 myVar
.
是什么类型
声明字段时(意思是 - class 级变量),它们会自动初始化为 their default value - null
用于引用类型,0
用于数字等' .但是,此默认值规则不适用于局部变量(意思是 - 在方法内声明的变量)或方法参数 - 您必须在使用它们之前显式初始化它们,否则您将收到编译错误:
int a;
Console.Write(a);
将产生此编译错误:
Use of unassigned local variable 'a'
每当您使用 return 的方法(意思是,它不是 void
)时,您可以直接使用该方法 returning 的任何方法,而无需将结果设置为一个变量:
if(myString.Split()[0] == someSubString) // use a value from the array
{ /* do some stuff here */ }
var result = SomeClass.Method().ToString(); // use ToString on the return value of Method
或者如果您不需要 return 值,则直接忽略它:
// Just an example, don't do that with TryParse!
int i;
int.TryParse(s, out i); // if fails, i will be initialized to it's default value - 0
// do some other stuff
为什么我不能访问那个数组?
可以,不必将结果放入变量中:
System.Diagnostics.Debug.Print(mystring.Split()[0]); //will print the value of index 0. This is dangerous.
有没有办法处理只声明但未初始化的东西?
如果它是一个引用对象,您可以检查声明的内容是否为 null,从技术上讲,它在初始化之前正在使用它。值类型在声明时被初始化为默认值。您可以声明一些类型并查看调试器中分配的值:
int four; //0
double two; //0
string[] fizbo; //null
object food; //null
对于只声明的东西,在运行时会发生什么?
您应该了解声明对象时会发生什么以及声明引用类型时会发生什么。
参见:https://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types
我对 C# 和一般编程还很陌生,我想知道简单声明与初始化之间的区别。
例如,如果我使用 String.Split()
方法,在文档中它说它 returns 一个带有分隔字符的数组,但为什么我不能访问该数组?我必须做类似的事情:
string [] array = mystring.Split()
有没有办法处理只声明但未初始化的东西?对于仅声明的事物(变量、数组等),在运行时会发生什么? 谢谢。
您通过声明变量的类型和名称来声明变量:
string[] array;
你通过给它初始值来初始化它:
string[] array; // declare
array = mystring.Split(); // initialize
在 c# 中,与在许多其他编程语言中一样,您可以将两个操作组合到一个代码行中:
string[] array = mystring.Split();
当你对局部变量这样做时,考虑使用 var
而不是在声明中显式地使用变量的类型,但只有在变量的类型可以很容易地从正确的推导出来的情况下赋值运算符的手边:
var list = new List<int>(); // best.
var array = mystring.Split(); // still quite good.
var myVar = SomeClass.SomeMethodThatWeDoNotKnow(); // not so good...
这样做的原因是,每个阅读代码的人都清楚 list
是 List<int>
,而您必须知道 string.Split return 是什么知道 array
是一个字符串数组,你需要实际将鼠标悬停在 var
关键字上才能知道 myVar
.
声明字段时(意思是 - class 级变量),它们会自动初始化为 their default value - null
用于引用类型,0
用于数字等' .但是,此默认值规则不适用于局部变量(意思是 - 在方法内声明的变量)或方法参数 - 您必须在使用它们之前显式初始化它们,否则您将收到编译错误:
int a;
Console.Write(a);
将产生此编译错误:
Use of unassigned local variable 'a'
每当您使用 return 的方法(意思是,它不是 void
)时,您可以直接使用该方法 returning 的任何方法,而无需将结果设置为一个变量:
if(myString.Split()[0] == someSubString) // use a value from the array
{ /* do some stuff here */ }
var result = SomeClass.Method().ToString(); // use ToString on the return value of Method
或者如果您不需要 return 值,则直接忽略它:
// Just an example, don't do that with TryParse!
int i;
int.TryParse(s, out i); // if fails, i will be initialized to it's default value - 0
// do some other stuff
为什么我不能访问那个数组?
可以,不必将结果放入变量中:
System.Diagnostics.Debug.Print(mystring.Split()[0]); //will print the value of index 0. This is dangerous.
有没有办法处理只声明但未初始化的东西?
如果它是一个引用对象,您可以检查声明的内容是否为 null,从技术上讲,它在初始化之前正在使用它。值类型在声明时被初始化为默认值。您可以声明一些类型并查看调试器中分配的值:
int four; //0
double two; //0
string[] fizbo; //null
object food; //null
对于只声明的东西,在运行时会发生什么?
您应该了解声明对象时会发生什么以及声明引用类型时会发生什么。
参见:https://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types