C# 语言规范--1.3 变量和参数

变量|规范

变量表示存储位置。每个变量都属于一种类型,它确定什么样的值可以存储在该变量中。局部变量是在方法、属性或索引器中声明的变量。局部变量是通过指定类型名称和声明符(它指定变量名和可选的初始值)定义的,如:

int a;

int b = 1;

但局部变量声明也可以包含多个声明符。a 和 b 的声明可以重写为:

int a, b = 1;

一个变量必须先赋值,然后才能使用它的值。示例

class Test

{

   static void Main() {

      int a;

      int b = 1;

      int c = a + b;   // error, a not yet assigned

      ...

   }

}

导致编译时错误,因为它试图在给变量 a 赋值之前使用它。

字段是与类或结构或与类或结构的实例关联的变量。用 static 修饰符声明的字段定义静态变量,不用此修饰符声明的字段则定义实例变量。静态字段与类型关联,而实例变量与实例关联。示例

using Personnel.Data;

class Employee

{

   private static DataSet ds;

   public string Name;

   public decimal Salary;

   ...

}

显示了具有一个私有静态变量和两个公共实例变量的 Employee 类。

形参声明也定义变量。有四种类型的参数:值参数、引用参数、输出参数和参数数组。

值参用于“in”参数传递。在此过程中,自变量的值被传入方法中。因为一个值参在方法中用自己的变量存储(而非原自变量),所以对此参数的修改不会影响到原自变量。值参的变量是通过复制原自变量的值来初始化的。示例

using System;

class Test {

   static void F(int p) {

      Console.WriteLine("p = {0}", p);

      p++;

   }

   static void Main() {

      int a = 1;

      Console.WriteLine("pre:  a = {0}", a);

      F(a);

      Console.WriteLine("post: a = {0}", a);

   }

}

显示了一个具有名为 p 的值参数的方法 F。示例输出结果如下

pre:  a = 1

p = 1

post: a = 1

即使值参数 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 = 1;

      int y = 2;

      Console.WriteLine("pre:  x = {0}, y = {1}", x, y);

      Swap(ref x, ref y);

      Console.WriteLine("post: x = {0}, y = {1}", x, y);

   }

}

显示了一个具有两个引用参数的 Swap 方法。产生的输出为:

pre:  x = 1, y = 2

post: x = 2, y = 1

在形参声明和形参的使用中都必须使用 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 = 1; i < 10; i++)

         for (int j = 1; j < 10; j++) {

            int ans, r;

            Divide(i, j, out ans, out r);

            Console.WriteLine("{0} / {1} = {2}r{3}", i, j, ans, r);

         }

   }

}

显示了一个 Divide 方法,该方法包含两个输出参数:一个参数用于除法的结果,另一个参数用于余数。

对于值、引用和输出这三种类型的参数,在调用方提供的自变量和用于表示它们的参数之间存在一对一的对应关系。参数数组则允许存在多对一关系:多个参数可以用一个自变量来表示。换言之,参数数组允许可变长度的自变量列表。

参数数组用 params 修饰符声明。一个给定的方法只能有一个参数数组,而且它必须始终是最后一个指定的参数。参数数组的类型总是一维数组类型。调用方可以传递一个属同一类型的数组变量,或任意多个与该数组的元素属同一类型的自变量。例如,示例

using System;

class Test

{

   static void F(params int[] args) {

      Console.WriteLine("# of arguments: {0}", args.Length);

      for (int i = 0; i < args.Length; i++)

         Console.WriteLine("\targs[{0}] = {1}", i, args[i]);

   }

   static void Main() {

      F();

      F(1);

      F(1, 2);

      F(1, 2, 3);

      F(new int[] {1, 2, 3, 4});

   }

}

显示了带数目可变的 int 参数的方法 F,以及对此方法的若干个调用。输出为:

# of arguments: 0

# of arguments: 1

   args[0] = 1

# of arguments: 2

   args[0] = 1

   args[1] = 2

# of arguments: 3

   args[0] = 1

   args[1] = 2

   args[2] = 3

# of arguments: 4

   args[0] = 1

   args[1] = 2

   args[2] = 3

   args[3] = 4

  

此介绍中出现的大部分示例使用 Console 类的 WriteLine 方法。此方法的参数替换行为(如下面的示例所示)

int a = 1, b = 2;

Console.WriteLine("a = {0}, b = {1}", 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) {...}

   }

}

时间: 2024-08-01 19:18:38

C# 语言规范--1.3 变量和参数的相关文章

《Groovy语言规范》-语法

原文链接  译者:王山山 语法 本章节涵盖了Groovy编程语言的语法.Groovy语言的语法源自Java语法,为Groovy增强了特定构造,允许一定程度上的简化语法. 1.注释 1.1.单行注释 单行注释以//开始,在一行中任何位置都可以被发现.//后面的字符,直到一行的末尾都是注释的一部分. // a standalone single line comment println "hello" // a comment till the end of the line 1.2.多行

《Groovy语言规范》-语法(一)

语法 本章节涵盖了Groovy编程语言的语法.Groovy语言的语法源自Java语法,为Groovy增强了特定构造,允许一定程度上的简化语法. 1.注释 1.1.单行注释 单行注释以//开始,在一行中任何位置都可以被发现.//后面的字符,直到一行的末尾都是注释的一部分. // a standalone single line comment println "hello" // a comment till the end of the line 1.2.多行注释 一个多行注释以/*开

JAVA语言规范-线程和锁章节之同步、等待和通知

原文链接  本文是Oracle官方<Java语言规范>的译文 JAVA语言规范:线程和锁 1 同步 JAVA编程语言提供了线程间通信的多种机制.这些方法中最基本的是同步化,此方法是使用监视器实现的.JAVA中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视器.一次仅有一个线程可能在监视器上持有锁.尝试锁住该监视器的任何其他线程被阻塞,直到它们可以再该监视器上获得一个锁.线程t可以多次锁住特别的监视器:每个解锁将一个加锁操作的作用反转来了. synchronized语句计算了一个对象的引用

C语言中使用环境变量的技巧

实例1: 程序readenv.c显示了在c语言中存取环境变量的若干技巧.该程序将以与dos的set命令相同的格式打印出当前所有的环境变量,然后寻找path变量,打印出整个路径字符串.该程序中有两个重要的子程序,find_env_string(),它的主要作用是:根据从调用这传来的要求,或者从环境空间的起点开始,或者从上一次搜索後停留的地方开始,寻找随后的第一个环境字符串,具体程序清单如下. /**************readnv.c****************/ #include #in

c语言-(纯C语言)如何监视某个变量的值

问题描述 (纯C语言)如何监视某个变量的值 程序中有个变量,希望当它的值变化时进行某种其他的操作,重点是监控这种变化,程序中不能用延时函数去循环查询该值是否发生变化,纯C语言中,还有其他方法吗? 解决方案 你说的很对,这个时候就要使用互斥机制. 解决方案二: 可以用一个静态变量保存他的值,判断就可以了... 解决方案三: 用定时中断查询http://www.cnblogs.com/chenyadong/archive/2011/10/19/2217128.html 解决方案四: 这个定时中断更好

class-c语言定义一对一对的可变参数函数

问题描述 c语言定义一对一对的可变参数函数 fund(type_1 data_1 type_2 data_2 ...); 类似这样的函数怎样定义. 解决方案 http://www.cnblogs.com/MarvinGeng/archive/2012/07/19/2598923.html 解决方案二: 定义一个参数数组作为一个参数 解决方案三: typedef struct field_pad{ UINT1 type; UINT1 len; INT1 pad[62];}field_pad_t;

c语言-C语言关于字符指针变量和字符数组的说法

问题描述 C语言关于字符指针变量和字符数组的说法 下列关于字符指针变量和字符数组的说法错误的是 A)字符指针变量的值可以变化 B)字符数组的值可以变化 C)字符指针变量代表了一个地址 D)字符数组代表了一个地址 ====答案选B,求解释? 解决方案 选择B.字符数组相当于指针常量. 解决方案二: 数组定义时系统给开辟内存单元,数组名相当于数组的开始地址是不能变化的 解决方案三: C语言字符指针和字符数组C语言中,为什么字符串可以赋值给字符指针变量字符数组和字符指针

我在linux系统的服务器上打开语言R环境,变量怎么分开保存?谢谢!

问题描述 我在linux系统的服务器上打开语言R环境,变量怎么分开保存?谢谢! 在linux系统的服务器上打开语言R环境,要依次处理多个数据文件,如果不分开,我在处理完后ls()会把所用设过的变量混一起告诉我,我想问能不能把处理某个文件的这个过程中设的变量与处理其它文件的设的那些变量隔离开? 解决方案 创建多个环境? new.env() 参考:http://www.tuicool.com/articles/7fqEJr

c语言-C语言如何输出一个变量的地址

问题描述 C语言如何输出一个变量的地址 scanf("%d",&a); 假如我输入"10",那这个"10"的地址怎么求,怎么输出来呢? 解决方案 你要好好看看指针的定义和运用. 你可以定义一个整型指针 int p: 然后定义一个整型变量 int a: p的值是一个整型变量的地址 &是取地址操作符 **p = &a:* 这样,指针变量p保存的就是整型变量a的地址了 你要引用整型变量a,可以直接使用变量本身a,也可以通过指针间