变量表示存储位置每个变量都属于一种类型它确定什么样的值可以存储在该变量中局部变量是在方法属性或索引器中声明的变量局部变量是通过指定类型名称和声明符(它指定变量名和可选的初始值)定义的如
int a;
int b = ;
但局部变量声明也可以包含多个声明符a 和 b 的声明可以重写为
int a b = ;
一个变量必须先赋值然后才能使用它的值示例
class Test
{
static void Main() {
int a;
int b = ;
int c = a + b; // error a not yet assigned
}
}
导致编译时错误因为它试图在给变量 a 赋值之前使用它
字段是与类或结构或与类或结构的实例关联的变量用 static 修饰符声明的字段定义静态变量不用此修饰符声明的字段则定义实例变量静态字段与类型关联而实例变量与实例关联示例
using PersonnelData;
class Employee
{
private static DataSet ds;
public string Name;
public decimal Salary;
}
显示了具有一个私有静态变量和两个公共实例变量的 Employee 类
形参声明也定义变量有四种类型的参数值参数引用参数输出参数和参数数组
值参用于in参数传递在此过程中自变量的值被传入方法中因为一个值参在方法中用自己的变量存储(而非原自变量)所以对此参数的修改不会影响到原自变量值参的变量是通过复制原自变量的值来初始化的示例
using System;
class Test {
static void F(int p) {
ConsoleWriteLine(p = {} p);
p++;
}
static void Main() {
int a = ;
ConsoleWriteLine(pre: a = {} a);
F(a);
ConsoleWriteLine(post: a = {} a);
}
}
显示了一个具有名为 p 的值参数的方法 F示例输出结果如下
pre: a =
p =
post: a =
即使值参数 p 已修改
引用参数用于by reference参数传递在此过程中引用参数就是调用者提供的自变量的别名引用参数并不定义自己的变量而是直接引用原自变量因此对引用参数的修改就将直接影响相应原自变量的值引用参数用 ref 修饰符来声明示例
using System;
class Test {
static void Swap(ref int a ref int b) {
int t = a;
a = b;
b = t;
}
static void Main() {
int x = ;
int y = ;
ConsoleWriteLine(pre: x = {} y = {} x y);
Swap(ref x ref y);
ConsoleWriteLine(post: x = {} y = {} x y);
}
}
显示了一个具有两个引用参数的 Swap 方法产生的输出为
pre: x = y =
post: x = y =
在形参声明和形参的使用中都必须使用 ref 关键字在调用位置使用 ref 可以引起对参数的特别注意这样阅读代码的开发人员就会知道参数值可以因调用而更改
对于输出参数来说调用者提供的自变量的初始值并不重要除此之外输出参数与引用参数类似输出参数是用 out 修饰符声明的示例
using System;
class Test {
static void Divide(int a int b out int result out int remainder) {
result = a / b;
remainder = a % b;
}
static void Main() {
for (int i = ; i < ; i++)
for (int j = ; j < ; j++) {
int ans r;
Divide(i j out ans out r);
ConsoleWriteLine({} / {} = {}r{} i j ans r);
}
}
}
显示了一个 Divide 方法该方法包含两个输出参数一个参数用于除法的结果另一个参数用于余数
对于值引用和输出这三种类型的参数在调用方提供的自变量和用于表示它们的参数之间存在一对一的对应关系参数数组则允许存在多对一关系多个参数可以用一个自变量来表示换言之参数数组允许可变长度的自变量列表
参数数组用 params 修饰符声明一个给定的方法只能有一个参数数组而且它必须始终是最后一个指定的参数参数数组的类型总是一维数组类型调用方可以传递一个属同一类型的数组变量或任意多个与该数组的元素属同一类型的自变量例如示例
using System;
class Test
{
static void F(params int[] args) {
ConsoleWriteLine(# of arguments: {} argsLength);
for (int i = ; i < argsLength; i++)
ConsoleWriteLine(\targs[{}] = {} i args[i]);
}
static void Main() {
F();
F();
F( );
F( );
F(new int[] { });
}
}
显示了带数目可变的 int 参数的方法 F以及对此方法的若干个调用输出为
# of arguments:
# of arguments:
args[] =
# of arguments:
args[] =
args[] =
# of arguments:
args[] =
args[] =
args[] =
# of arguments:
args[] =
args[] =
args[] =
args[] =
此介绍中出现的大部分示例使用 Console 类的 WriteLine 方法此方法的参数替换行为(如下面的示例所示)
int a = b = ;
ConsoleWriteLine(a = {} b = {} a b);
是使用参数数组完成的为适应常见的各种需要WriteLine 方法有若干个重载的方法供选用这些方法中有些需传递固定个数的参数有些使用了参数数组
namespace System
{
public class Console
{
public static void WriteLine(string s) {}
public static void WriteLine(string s object a) {}
public static void WriteLine(string s object a object b) {}
public static void WriteLine(string s params object[] args) {}
}
}