装箱拆箱
当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
动态类型
可以存储任何类型的值在动态数据类型变量中。dynamic count = 20;
[!note]
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
字符串
字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。
例如:String str = "runoob.com";
一个 @引号字符串:@"runoob.com";
C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如:string str = @"C:\Windows";
等价于:string str = "C:\\Windows";
@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
string str = @"第一行
第二行
第三行
第四行";
可以使用以下方法之一来创建 string 对象:
- 通过给 String 变量指定一个字符串
- 通过使用 String 类构造函数
- 通过使用字符串串联运算符( + )
- 通过检索属性或调用一个返回字符串的方法
- 通过格式化方法来转换一个值或对象为它的字符串表示形式
下面的实例演示了这点:
创建string对象
using System;
namespace StringApplication
{
class Program
{
static void Main(string\[\] args)
{
//字符串,字符串连接
string fname, lname;
fname = "Rowan";
lname = "Atkinson";
//通过使用 string 构造函数
char[] letters = { 'H', 'e', 'l', 'l','o' };
string greetings = new string(letters);
//方法返回字符串
string[] sarray = { "Hello", "From", "Tutorials", "Point" };
string message = String.Join(" ", sarray);
//用于转化值的格式化方法
DateTime waiting = new DateTime(2012, 10, 10, 17, 58, 1);
string chat = String.Format("Message sent at {0:t} on {0:D}",
waiting);
}
}
}
String 类有以下两个属性:
序号 | 属性名称 & 描述 |
---|---|
Chars | 在当前 String 对象中获取 Char 对象的指定位置。 |
Length | 在当前的 String 对象中获取字符数。 |
String 类有许多方法用于 string 对象的操作。csharp之string类的一些最常用的方法
常用类型转换
Convert. ToBoolean
ToChar
ToDateTime
ToDouble
运算符
算术运算符 + - * / % ++ --
关系运算符 < = <= != ==
逻辑运算符 && 与 || 或 !非
位运算符 & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 << 左移 右移
其他运算符 sizeof() 返回大小 typeof() 返回类型 & 取地址 * 变量指针 ?: 条件表达式 is 类型判断 as 类型强制转换
封装 访问修饰符
- private:允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员;
- protected:只有该类对象及其子类对象可以访问;
- internal:同一个程序集的对象可以访问;
- protected internal:访问限于当前程序集或派生自包含类的类型。
- public:允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问;
参数传递
- 参数传递的默认方式为按值传递。
- 按引用传递,形参会改变实参,在c#中使用ref关键字声明引用参数。
public void swap(ref int x, ref int y) //实参将真实的进行调换
{
int temp;
temp = x; // 保存 x 的值
x = y; // 把 y 赋值给 x
y = temp; // 把 temp 赋值给 y
}
- return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。
public void getValue(out int x )
{
int temp = 5;
x = temp;
}
int a = 100;
getValue(out a);
//在方法调用之前,a 的值: 100
//在方法调用之后,a 的值: 5
可空类型
单问号运算符:
int? i = null;
单问号用于对 int、double、bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是可空类型(Nullable)的。
双问号运算符:
static void Main(string[] args)
{
double? num1 = null;
double? num2 = 3.14157;
double num3;
num3 = num1 ?? 5.34; // num1 如果为空值则返回 5.34
Console.WriteLine("num3 的值: {0}", num3); //结果5.34
num3 = num2 ?? 5.34;
Console.WriteLine("num3 的值: {0}", num3); //结果3.14157
Console.ReadLine();
}
数组
数组中某个指定的元素是通过索引来访问的。所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。
//声明,隐式初始化每个数组元素为一个默认值,int 数组的所有元素都会被初始化为 0
int[] counts;
//声明并初始化
double[] balance = new double[10];
//赋值
balance[0] = 4500.0;
//声明并赋值
double[] balance = { 2340.0, 4523.69, 3421.0};
//创建并初始化
int[] marks = new int[5] { 99, 98, 92, 97, 95};
//在上述情况下,可以省略数组的大小
int[] marks = new int[] { 99, 98, 92, 97, 95};
//可以赋值一个数组变量到另一个目标数组变量中。在这种情况下,目标和源会指向相同的内存位置
int[] marks = new int[] { 99, 98, 92, 97, 95};
int[] score = marks;
Array类
Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义。Array 类提供了各种用于数组的属性和方法。
csharp之Array类的常用属性
csharp之array类的常用方法
多维数组
可以声明一个 string 变量的二维数组,如:string [,] names;
或者,声明一个 int 变量的三维数组,如:int [ , , ] m;
多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。
int [,] a = new int [3,4] {
{0, 1, 2, 3} , /* 初始化索引号为 0 的行 */
{4, 5, 6, 7} , /* 初始化索引号为 1 的行 */
{8, 9, 10, 11} /* 初始化索引号为 2 的行 */
};
//访问数组
int val = a[2,3];
交错数组
交错数组是数组的数组
int [][] scores;
//声明一个数组不会在内存中创建数组。创建上面的数组:
int[][] scores = new int[5][];
for (int i = 0; i < scores.Length; i++)
{
scores[i] = new int[4];
}
//初始化
int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};
//其中,scores 是一个由两个整型数组组成的数组 -- scores[0] 是一个带有 3 个整数的数组,scores[1] 是一个带有 4 个整数的数组。
传递数组给函数
double getAverage(int[] arr, int size)
{......}
//一个带有 5 个元素的 int 数组
int [] balance = new int[]{1000, 2, 3, 17, 50};
//传递数组的指针作为参数
getAverage(balance, 5 ) ;
参数数组
有时,当声明一个方法时,不能确定要传递给函数作为参数的参数数目。参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。
在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。params 的使用示例:
public int AddElements(params int[] arr)
{
int sum = 0;
foreach (int i in arr)
{
sum += i;
}
return sum;
}
int sum = AddElements(512, 720, 250, 567, 889);
结构体
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
public void setValues(string t, string a, string s, int id)
{
title = t;
author = a;
subject = s;
book_id =id;
}
};
Books Book; /* 声明 Book1,类型为 Books */
Book.title = "C Programming";
Book1.setValues("C Programming", "Nuha Ali", "C Programming Tutorial",6495407);
C# 中结构体的特点
- 结构可带有方法、字段、索引、属性、运算符方法和事件。
- 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
- 与类不同,结构不能继承其他的结构或类。
- 结构不能作为其他结构或类的基础结构。
- 结构可实现一个或多个接口。
- 结构成员不能指定为 abstract、virtual 或 protected。
- 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
- 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
类 Vs 结构
类和结构有以下几个基本的不同点:
- 类是引用类型,结构是值类型。
- 结构不支持继承。
- 结构不能声明默认的构造函数。
枚举
枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0.例如:
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
int x = (int)Day.Sun;