csharp条陈

2023-03-04 10:36 Saturday28126min
CC BY 4.0(除特别声明和转载)

装箱拆箱

当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱

动态类型

可以存储任何类型的值在动态数据类型变量中。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 类型强制转换

封装 访问修饰符

  1. private:允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员;
  2. protected:只有该类对象及其子类对象可以访问;
  3. internal:同一个程序集的对象可以访问;
  4. protected internal:访问限于当前程序集或派生自包含类的类型。
  5. public:允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问;

参数传递

  1. 参数传递的默认方式为按值传递。
  2. 按引用传递,形参会改变实参,在c#中使用ref关键字声明引用参数。
public void swap(ref int x, ref int y)  //实参将真实的进行调换
{  
int temp;  
temp = x; // 保存 x 的值 
x = y;    // 把 y 赋值给 x 
y = temp; // 把 temp 赋值给 y 
} 
  1. 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[]{1000231750};  
//传递数组的指针作为参数
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(512720250567889);

结构体

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;

BuyMeACola