c#基础知识
部分变量类型:
简单类型:
非数值型:
- char : 一个Unicode字符,存储0-65536之间的整数
- bool:布尔值:ture,false;
- string:一组字符;
不识别转义字符:
- 如果不想识别字符串中的转义字符可以在字符串前面添加: @符号
goto语句的使用:
- 执行到goto语句的时候,直接跳到goto指定的标签处运行,不执行中间的语句;
int myint = 5;
goto mylable;
myint++;
mylable:Console.WriteLine(myint);
// 其结果为5;
类型转换:
隐式类型转换:编译器自动识别
- 内存小的系统类型可以向类型大的系统类型变量进行转化—> int 转换为 long,float,double
显示转换:需要我们告诉编译器从什么类型转换成什么类型
- 内存小的系统类型可以向类型大的系统类型变量进行转化—> ong,float,double 转换为 int
枚举类型:其实质是整数类型:不指定值的话,就从0开始
enum <类型名称>{
<value1>,
<value2>,
<value3>
}
使用方法:
struct Position
{
public float x;
public float y;
public float z;
}
class Program
{
static void Main(string[] args)
{
#region 使用结构体
Position enemy1;//声明结构体,相当于使用结构体中多有的变量去声明
enemy1.x = 34;
enemy1.y = 42;
enemy1.z = 45;
#endregion
Console.WriteLine("{0},{1}",enemy1.x,enemy1.y) ;
Console.ReadLine();
}
}
数组
数组赋值:
int[] scores;
- scores = {34,34,3,5,54,67} //数组长度不固定
- scores = new int[10];//scores 数组当中的初始值为默认值
- scores = new int[10]{3,4,3,4,3,5,5,4,6,7};
数组的访问:
- scores[1];
委托:是一种存储函数引用的类型
委托的定义指定了一个返回类型和一个参数列表,定义了委托之后,就可以声明该委托的变量,接着就可以把一个返回类型跟参数列表跟委托一样的函数赋值给这个变量
堆和栈:程序运行时的内存区域
栈的特征:
数据只能从栈的顶端插入和删除。
把数据放入栈称为入栈,从栈顶删除叫出栈。
堆的特征:
堆是一块内存区域,与栈不同,堆里的内存能够在任意位置存入和删除。
Gc垃圾回收器:
CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,GLR已经帮助我们做了。
值类型与引用类型:
值类型:
整数,bool struct char 小数、
值类型只需要一段单独的内存,用于存储实际的数据
引用类型:
string 数组 自定义的类 内置的类
引用类型需要两段内存,第一段存储实际的数据--->位于堆中;
第二段是一个引用--->指向数据在堆中的存放位置。
字符串和正则表达式
字符串的常规使用:
- Compare 字符串的比较:int result= string.Compare(string str1,string str2);
- Concat连接方法参数很多,常用的Concat(string str1,string str2);
- IsNullOrEmpty判断字符是否为null或者为空,返回值为bool;
- Join字符串的合并 string.Join(string str,string[] strArr);//将数组strArr中的内容拼接成一个新的字符串,并在对应数组的每两项间添加分隔符str string strs=string.Join(",",string[]{“w”,“e”,“r”,“t”});//strs=“w,e,r,t”;
- Contains 判断字符串中是否包含某个字符,返回bool值。 string str=“好累呀”; bool b=str.Contains(“累”);//b=true;
- EndsWith和StartsWith 判断是否是已某种字符串开始或者结束tring str=“好大的雨呀”;bool b1=str.StartsWith(“大”);//b1=false;bool b2-str.EndsWith(“呀”);//b2=true;
- Equals 比较两个字符串是否相等string str1=“asd”; string str2=“ert”;bool b = str1.Equals(str2); //b=false;bool .Equals(string str,StringComparison.OrdinalIgnoreCase) //表示不区分大小写
- IndexOf 和 LastIndexOf 判断字符串第一次出现(IndexOf)和最后一次出现(LastIndexOf )的位置,如果没有出现过则返回值为-1
string str =“今天的雨很大,天很冷”; int i=str.IndexOf(“很”); //i=4; int i=str.LastIndexOf(“很”);//j=8; int m=str.IndexOf(“小”);//m=-1;
StringBuilder:
String的字符常量其长度是不可变的,StringBuilder的长度是可变的。
基础综合使用实例:泛型类的冒泡排序。
class Program
{
static void Main(string[] args)
{
Employee[] employees = new Employee[] {
new Employee("小明", 21),
new Employee("小红", 24),
new Employee("小白", 11)
};
CommonSort<Employee>(employees, Employee.Compare);
foreach (Employee employee in employees) {
Console.WriteLine(employee.ToString());
}
Console.Read();
}
static void CommonSort<T>(T[] data, Func<T, T, bool> compare)
{
bool swapped = true;
do
{
swapped = false;
for (int i = 0; i < data.Length - 1; i++)
{
if (compare(data[i], data[i + 1]))
{
T temp = data[i];
data[i] = data[i + 1];
data[i + 1] = temp;
swapped = true;
}
}
} while (swapped);
}
}
class Employee
{
public string Name { get; private set; }
public int Salary { get; private set; }
public Employee(string name, int salary)
{
Name = name;
Salary = salary;
}
//员工类比较大小方法
public static bool Compare(Employee em1, Employee em2)
{
if (em1.Salary > em2.Salary)
{
return true;
}
else
{
return false;
}
}
public override string ToString()
{
return String.Format("name:{0},Salary:{1}", this.Name, this.Salary);
}
}
事件的使用 event -->其实质就是 委托
class Mouse
{
public string color;
public string name;
public Mouse(string Name, string Color,Cat cat)
{
this.color = Color;
this.name = Name;
cat.catCom+=this.MouseChase;//每创建一个老鼠都会将老鼠的MouseChase方法添加到catCom方法中
// 然后当catCom方法被调用的时候就会运行所有的委托; 相当与订阅了catCom
}
public void MouseChase()
{
Console.WriteLine(color +"的老鼠"+name +"说:快跑啊!");
}
}
class Cat
{
public string name;
public string color;
public Cat(string Name, string Color)
{
this.color = Color;
this.name = Name;
}
public void CatComing()
{
Console.WriteLine("颜色是"+color +"的"+name +"猫: 喵喵喵!");
if (catCom != null)
{
catCom();
}
}
public event Action catCom;//定义一个委托,方便其他地方注册
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("汤姆猫","黑色");
Mouse mouse1 = new Mouse("米老鼠","黑色", cat);
Mouse mouse2 = new Mouse("杰克","黑色", cat);
cat.CatComing();
Console.ReadKey();
}
}
事件反向通知实际应用
//属性更新无法实现通知时,需要通过事件进行通知,在生产者内中添加事件
public event Action<AsyncObservableCollection<CassetteLayer>> UpdataPutCassetteLayers;//定义一个委托,方便其他地方注册
在改变时调用改事件
UpdataPutCassetteLayers.Invoke(null);
在消费者类中创建该事件,创建时间是在new 对象之后
extraman = ElectricService.Instance.GetDevice<IPanelLoader>();
extraman.UpdataPutCassetteLayers += Extraman_UpdataPutCassetteLayers;
//在事件中执行需要执行的操作,实例中的操作为通知PutLayers属性与Layers属性再去调用get方法
private void Extraman_UpdataPutCassetteLayers(AsyncObservableCollection<CassetteLayer> obj)
{
RaisePropertyChanged("PutLayers");
RaisePropertyChanged("Layers");
}
文件的读写操作
文件属性
FileInfo fileInfo = new FileInfo("111.txt");
//判断文件是否存在
if (fileInfo.Exists) {
Console.WriteLine(fileInfo.FullName);
Console.Read();
}else {
Console.WriteLine("文件不存在");
Console.Read();
}
Console.WriteLine(fileInfo.FullName);//文件地址
Console.WriteLine(fileInfo.Name);// 文件名
Console.WriteLine(fileInfo.Extension);//文件后缀名
Console.WriteLine(fileInfo.DirectoryName);//文件路径
Console.WriteLine(fileInfo.Directory);//文件路径
Console.WriteLine(fileInfo.IsReadOnly);//文件是否为只读
Console.WriteLine(fileInfo.Length);//文件大小
文件方法
fileInfo.CopyTo("tt.txt"); //复制当前文件到tt.txt
fileInfo.Create(); //如果文件不存在就创建该文件
文件读写
读文件:
//读取每一行 结果放在数组中
if (fileInfo.Exists) {
string[] text = File.ReadAllLines("111.txt");
foreach (string line in text) { Console.WriteLine(line); }
Console.Read();
}else {
}
//读取所有文本放在字符串中
string text = File.ReadAllText("111.txt");
Console.WriteLine(text);
DDD领域驱动设计知识点
四层架构
- 展示层:view
- 应用层
- 领域层 :核心业务代码,一切体现领域行为的 实体、接口、领域服务
- 基础设施层
常见知识:
限界上下文:
划分领域的标志