【C#与.NET程序设计】(3)- C#基本参数类型

参数

参数修饰符

C#默认按值传递。此外C#提供 out、ref、params 3种参数修饰符,可以影响参数传递方式

//***************************
// out 修饰符
// 定义为函数的输出参数
// 变为按引用传递
// 好处是,函数可以定义多组返回值
static void Add(int x, int y, out int ans){
    ans = x + y;
}
int ans;
Add(90, 90, out ans);

//**************************
// ref 修饰符
// 与 c++ 的 & 效果一样,强制参数按引用传递
public static void SwapStrings(ref string s1, ref string s2){
    string temp = s1;
    s1 = s2;
    s2 = temp;
}

//**************************
// params 修饰符
// 可以把可变数量的参数(相同类型)作为单个逻辑参数传给方法
static double CalculateAverage(params double[] values)
{
    Console.WriteLine("u sent me {0} doubles", values.Length);
}
// 以逗号分隔的方式调用
double ave = CalculateAverage(4.0, 3.2, 5.7, 87.2);
// 或者传递一个double数组
double[] data = {4.0, 3.2, 5.7};
double ave = CalculateAverage(data);

可选参数和命名参数

// 可选参数
// 与 c++ 一样,可选参数必须放在签名参数后面
static void func(string message, string owner, string date, string level = "debug"){
    ...
}

//**************************
// 命名参数
// 允许调用方法时以任意顺序指定参数的值
// 往往和可选参数一起用,方便调用
// 以可选参数的 func 函数为例
func("testing...", date: "2017", owner: "yayo"); // 正确的调用
func(date: "2017", "testing...", owner: "yayo"); // 错误的调用,命名参数必须在位置参数之后

数组

基于System.Array

// 数组初始化
// 使用 new
string[] stringArray = new string[]{"one", "two", "three"};
// 使用 new 并指定大小
string[] stringArray = new string[3]{"one", "two", "three"};
// 不使用 new
string[] stringArray = {"one", "two", "three"};

//**************************
// 隐式类型数组
// 要求每一项的类型都一样
var a = new[]{1, 10, 100};   // 编译器会解释为 int[]
var c = new[]{"one", "two"}; // 编译器会解释为 string[]

//**************************
// object 数组
// 由于 System.Object 是.NET所有类型的基类
// 因此 object 数组的每一项可以是任何类型
object[] myObjects = new object[4];
myObjects[0] = 10;
myObjects[1] = false;
myObjects[2] = new DateTime(1969, 3, 2);
myObjects[3] = "a string"

//**************************
// 多维数组
// 分两种:矩形数组 - 每一行长度都相同
//         交错数组 - 每一行长度可定义
int[,] myMatrix = new int[6,6]     // 矩形数组创建
int iValue = myMatrix[1,2];        // 矩形数组访问

int[][] myJagArray = new int[5][]; // 交错数组创建
iValue = myJagArray[1][2];         // 交错数组访问

//**************************
// 数组作为参数
// 输入参数
static void PrintArray(int[] myInts){
    ...
}
// 返回值
static string[] GetStringArray(){
    ...
}

其他类型

枚举

// 枚举类型
// 与 C++ 基本一致
// 默认是 int 类型,可以指定为其他类型(如 byte)
enum EmpType:byte
{
    Manager = 10,
    Grunt,
    Contractor
}

//******************************
// System.Enum 的静态方法
EmpType emp = EmpType.Grunt;
Enum.GetUnderlyingType(emp.GetType());          // 获取对应枚举的数据类型(byte)
emp.GetType().Name;                             // 获取对应枚举的名字(EmpType)
Array enumData = Enum.GetValues(emp.GetType()); // 获取枚举的全部成员及值
for(int i=0; i<enumData.Length; i++)
    Console.WriteLine("Name:{0}, Value:{0:D}", enumdATA.GetValue(i));

结构

// 结构类型
// 与C++基本一致
struct Point
{
    // 字段
    public int x;
    public int y;
    // 方法
    public void Display()
        Console.WriteLine("x={0}, y={1}", x, y);
}

// 直接创建
Point p1;
// 用 new 的方式创建变量
Point p1 = new Point();

值类型和引用类型

需要明确的是,class 和 object 是引用类型,其他类别都是值类型

  • 对于值类型,赋值操作会生成一个副本,两者都可以独立操作
  • 对于引用类型,赋值操作会生成一个引用,两者指向的还是同一个对象
  • 将引用类型作为函数参数传入,可以起到 ref 效果(但并不等同)

考虑这种场景:一个结构(值类型)里包含一个类(引用类型)对象,当该结构对象被赋值给另一个对象时,两个对象的类会被同步修改(因为指向同一对象),其他对象可独立操作

可空类型

可空类型会将实际类型加上 null
如 bool 一般仅包含{false, true},定义为可空类型后包含{false, true, null}
注意:引用类型(string)不能创建可空

在涉及数据库编程时,可空类型变得特别有用。因为一个数据表中的列可能是空的

// 可空类型
// 定义可空类型
int? nullableInt = 10;
bool? nullableBool = null;
char? nullableChar = 'a';
int?[] arrayOfNullableInts = new int?[10];

//*****************************
// ??操作符
// 可空类型的 ?: 语句
int myData = nullableInt ?? 100; // 如果nullableInt 为null 则赋值100

参考

【1】C#与.NET 4高级程序设计(第5版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值