C#基础语法
C#基本概念:
是一种面向对象的编程语言。
语言特点:继承、封装、和多态。
继承
允许根据一个类来定义另一个类,已有的类叫做基类,新创建的类就叫做派生类,同时根据多个类定义一个新类,此时就叫做多重继承 ,反之就是单一继承。这里需要注意C# 不支持多重继承
封装:
把一个或者多个项目封闭在一个物理的或者逻辑的包中。封装根据需要进行设置使用这的访问权限: C#访问修饰如下
public:所有对象都可以访问;
private:对象本身在对象内部可以访问;
protected:只有该类对象及其子类对象可以访问
internal:同一个命名空间的对象可以访问;
protected internal:访问限于当前程序集或派生自包含类的类型。
多态
多态是指同一个行为具有多个不同的表现形式,或者形态的能力,可以简单理解成为子类对所继承的接口或基类所进行的拓展,或者方法的重载均属于对象的多态
基本语法
关键字:
using 在程序中引用命名空间
成员变量
变量是类的属性或者数据成员,用于存储数据
成员函数
函数是一系列执行指定任务的语句。类的成员函数在类中声明的,简单一句,在类中定义的函数就是成员函数又叫做成员方法
C#关键字:
关键字是c#预定义的保留字
详见菜鸟教程:lC#基础语法
变量
系统提供一个程序操作的存储区的名字,每个变量都有自己的类型以及变量值
常量:常量可以看作一种特殊的变量,在程序中一旦被定义就无法被改变
常量的基本数据类型: 数值类型,字符类型
const和readonly
const(常量): 常量是固定值,程序执行期间不会改变
readonly:使用此修饰符的变量一旦被赋值,就只能程序中使用 不能进行更改.
区别:const:在编译时就已经被初始化赋值。
readonly:程序运行时变量进行初始化赋值
数据类型
C#数据类型共分为值类型,引用类型 指针类型
值类型
C#基本的值类型的数据类型有很多 仅对常用的进行列举: Int long float demical char byte ;
C#内置引用类型数据 object ,dynamic string class, Array ,interface 委托
C#指针类型
(应用较少 不做过多解释)
值类型,引用类型区别
值类型存储在栈中,引用类型存储在堆中
装箱:将之类型转化成引用类型
拆箱:将引用类型转化成值类型
注意:频繁的装拆箱操作会造成系统的效率低下;
结构体
概念:结构体是一种值类型相关的数据结构。让其单一变量可以存储各种数据类型的相关数据.1
如何定义:使用 struct关键字 创建结构体 其其方式类似类的定义
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
使用 :
Books Book1; /* 声明 Book1,类型为 Books */
Books Book2; /* 声明 Book2,类型为 Books */
/* book 1 详述 */
Book1.title = "C Programming";
Book1.author = "Nuha Ali";
Book1.subject = "C Programming Tutorial";
Book1.book_id = 6495407;
C#中结构体的优点:
结构可带有方法、字段、索引、属性、运算符方法和事件。
结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
与类不同,结构不能继承其他的结构或类。
结构不能作为其他结构或类的基础结构。
结构可实现一个或多个接口。
结构成员不能指定为 abstract、virtual 或 protected。
当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
结构体与类的区别:
类是引用类型,结构体值类型
结构体不支持继承
结构体不能声明默认的构造函数
结构体中声明的字字段无法赋初值 ,类中可以
枚举
概念:枚举是一种命名整型常量.枚举类型使用enum关键字进行声明
声明枚举变量数据
模板
enum <enum_name>
{
enumeration list
};
定义枚举示例
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
enum_name 指定枚举的类型名称。
enumeration list 是一个用逗号分隔的标识符列表。
Array
数组一个存储相同元素的固定大小的集合 ,数组是用来存储数据的集合,数组是使用索引器进行读取数据
String和StringBulid
string:是C#中的一种数据类型,其本质上更像是一种字符数组,拥有一些已经封装好的实例方法,string是微软定义的关键字代替String
微软string
StringBuild:可变字符字符串
详见[微软StringBulid]
string 与StringBulider 的区别:
String声明之后在内存中大小是不可修改的,而StringBuilder可以自由扩展大小(String分配在栈区,StringBuilder分配在堆区)
如何使用 :
对字符串操作不是太过于频繁 可以使用string ;
对字符串操作过于频繁 使用StringBulider
运算符:
算术运算符、 关系运算符、逻辑运算符、位运算符、赋值运算符及其他运算符
运算符重载:
程序开发中根据自身需求进行运算符的功能进行修改。
C#重载运算符是具有特殊名称的函数,是通过关键字operator后跟运算符的符号来定义。
摘录菜鸟示例代码
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
流程控制
流程控制语句列举:
if …else :
if … else if …else:运行模式类似于switch case
switch case
while
do … while
for
foreach
break
continue
注意:
if else if 和 switch case的区别:
if else-if:语句的判断条件是一个条件表达式。
switch:语句的判断条件只能是常量表达式
流程控制语句可以嵌套使用,同样的条件使用不同方式的流程控制语句产生不同的性能损耗
例如
多个条件并行存在 或 关系
这里使用a,b,c代替条件
if (a){ }
if (b) { }
if (c) { }
else { };
if (a) { }
else if (b) { }
else if (c) { }
else { }
区别:
方式一实现,在首个条件满足时,系统在运行时仍然会进行条件判断
方式二实现:当首个条件满足时,系统在运行代码不会再执行相应条件判断
当只有最后一个条件满足时 两种实现方式的运行效率相同
多个条件同时存在 与关系
if (a)
{
if(b)
{
if(c)
}
}
//实现时仅需将获得结果集重新赋给数据集即可 适用于数据筛选过滤
bool flag=false;
if (a) {flag=true; }
if (b) { flag=true;}
if (c) {flag=true; }
方式一:使用嵌套语句,需要考虑的条件较多,最多可达到 n的平方中条件
方式二:使用状态值进行判定,考虑条件较少,仅需n中条件
总结:目前来说两种方式的效率几乎相同在实际开发中推荐使用方式二 ,使用方式二的形式的代码可读性更高,
foreach 和 for 区别
foreach 遍历的对象必须继承Ienumable<>
for 循环需要检测对象是否可以进行循环
算法
冒泡 快速排序
int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
for (int i = 0; i < nums.Length - 1; i++)
{
for (int j = 0; j < nums.Length-1-i; j++)
{
if (nums[j] > nums[j + 1])
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
//打印数组
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
}
static void QuickSort(int[] dataArray, int left, int right)
{
if (left < right)
{
//基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边
int x = dataArray[left];
int i = left;
int j = right;
while (i < j)//当i==j的时候,说明我们找到了一个中间位置,这个中间位置就是基准数应该所在的位置
{
//从后往前比较
//找到了一个比基准数 小于或者等于的数子,应该把它放在x的左边
while (i < j)
{
if (dataArray[j] <= x)
{
dataArray[i] = dataArray[j];
break;
}
else
{
j--;//向左移动 到下一个数字,然后做比较
}
}
//从前往后
while (i < j)
{
if (dataArray[i] > x)
{
dataArray[j] = dataArray[i];
break;
}
else
{
i++;
}
}
}
//跳出循环 现在i==j i是中间位置
dataArray[i] = x;
QuickSort(dataArray, left, i - 1);// left -i- right
QuickSort(dataArray, i + 1, right);
}
}
(保证完全正确)
面向对象
封装 :
继承 :
多态 :
重载:在同一类中定义多个方法名称相同,参数不同或返回类型不同的方法
重写:子类将父类的方法进行修改,同时将父类的方法以Base()的形式将其保存起来 父类中的函数 必须使用virtual 修饰符修饰
修饰符 :详见开篇
类的成员 :包含数据成员和函数成员
数据成员:字段,常量,默认时实例成员,除非使用static 关键字修饰
字段 :与类相关的变量 (其数据类型根据使用情况自行确定)
常量:使用const关键字明 ,若将其声明为public ,则就可以在类的外面进行访问。
函数成员:
方法 : 是将一些相关语句组织在一起,用于执行一个任务的代码语句块 ,
<Access Specifier> <Return Type> <Method Name>(Parameter List) { Method Body }
C#中的方法只能声明在类中,调用方法可以是自身的其他成员方法,或者其他类进行调用,具体和方法的修饰符有关系
属性:属性是类,结构体,和接口的命名成员。类或结构体中的成员方法或变量称之为域,属性是对域的拓展,通过使用访问域可让私有域的值被外界访问‘;
事件 :在发生某些行为时可以使用对象通知调用方 ,是一种特殊的委托,详细介绍在c#高级语法;
索引器:可以使用访问数组的方式访问类的内部成员
接口
概念 :约束类de成员的一种行为规范
成员: 属性 方法 事件 索引器 ,
注意:接口中的方法都是抽象成员,接口的所有成员不能使用修饰符,默认的访问形式是public
作用:是一种行为规范 继承接口的程序可以更加安全
了解 抽象工厂模式 :
在实例化一个类时,不进行直接实例化,通过调”工厂方法“的形式,进行实例化类
优点 :生产出类更加安全,符合某种约束条件,才能被实例化 ,
小提示 :对于设计模式的介绍后期会有详细的教程,这里仅作简单描述!!!
abstract :
抽象 ,使用abstract 修饰的成员 叫做抽象成员。
抽象类和接口的区别:
从继承上来说 接口可以多继承,抽象类只能单继承,
从成员上讲:接口成员少 ,抽象类成员多
从使用 ,类继承接口 必须实现所有成员,抽象类可以不实现 ,如果实现 只需要添加相应的修饰符,使用场景,接口为了制约 ,抽象类是为了扩展
C#的简单知识概念总结暂为以上部分,将会不定期对其进行相关修改 ,同时首次写博客没有经验,版面稍微错乱 ,相关知识总结不是非常到位,如发现错误部分请联系修改 。
提示:下一篇 c#高级概念