大良网站制作,视频网站开发,电子商务网站建设前期,一套会员管理系统多少钱文章目录 1.三目运算符2.循环控制语句 (for while do…while foreach)3.访问修饰符4.静态方法和非静态方法5.数组、字典和其他集合类型1. 数组#xff08;Array#xff09;2. 列表#xff08;List#xff09;3. 字典#xff08;Dictionary#xff09;4. 队列#xff08;… 文章目录 1.三目运算符2.循环控制语句 (for while do…while foreach)3.访问修饰符4.静态方法和非静态方法5.数组、字典和其他集合类型1. 数组Array2. 列表List3. 字典Dictionary4. 队列Queue5. 栈Stack6. 散列集HashSet总结一下 6. out和ref7.属性和变量8.构造函数9.面向对象封装、继承、多态10.接口Interface11.抽象类 很久没有用写C#代码了最近花了点时间重温了一下C#语法的一些知识点查缺补漏
1.三目运算符
//三目运算符?:
//如 a0?1:2
int a -1;
// 通过以及将表达式分为3部分
var result a 0 ? 1 : 2;
// 号前表示条件得到一个bool值如果为真返回号前面的结果否则返回号后面的结果
Console.WriteLine(result);// 当a0 返回1
// 当a0 返回2
// 否则 返回0
代码示例
a 1;
result a 0 ? 1 : (a 0 ? 2 : 0);//1
Console.WriteLine(result);
a -1;
result a 0 ? 1 : (a 0 ? 2 : 0);//2
Console.WriteLine(result);
a 0;
result a 0 ? 1 : (a 0 ? 2 : 0);//0
Console.WriteLine(result);2.循环控制语句 (for while do…while foreach)
// 针对数据集合进行遍历
int[] values new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine(values);
for (int i 0; i values.Length; i)
{// i:0 1 2 3 4 5 6 7 8 // 0 2 4 6 8if (i % 2 0)Console.WriteLine(values[i]);if (i % 2 0) continue;Console.WriteLine(values[i]);// break : 跳转循环循环终止// continue : 结当次循环后面的代码不执行了直接执行下次循环
}int index 0;
// foreach遍历每一个元素
foreach (int i in values)
{Console.WriteLine(i);index;
}// while :首先判断条件条件满足进入循环。可能一次都执行不了
index 5;
while (index 5)
{// 死循环 index 5一直为TrueConsole.WriteLine(Hello);index;
}
Console.WriteLine(while结束);// do..while 选择执一遍再判断条件条件满足继续执行不满足即跳出。至少可以执一次
index 5;
do
{Console.WriteLine(Hello);index;
} while (index 5);3.访问修饰符
你可以把访问修饰符想象成一个家庭的不同房间和钥匙。public就像是客厅任何人都可以进入。private是你的私人房间只有你自己可以进入。protected像是家庭成员共用的房间只有家庭成员派生类可以进入。internal则是整个家同一程序集的公共空间只要是住在这个家里的人都可以进入。protected internal和private protected则是钥匙的组合给予更多灵活的访问控制。
public完全公开的。同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。 某一类型的公共成员的可访问性水平由该类型本身的可访问性级别控制。访问级别 0private只有同一 class 或 struct 中的代码可以访问该类型或成员。访问级别 5protected只有同一 class 或者从该 class 派生的 class 中的代码可以访问该类型或成员。访问级别 4internal同一程序集中的任何代码都可以访问该类型或成员但其他程序集中的代码不可以。访问级别 3protected internal该类型或成员可由对其进行声明的程序集或另一程序集中的派生 class 中的任何代码访问。访问级别 2private protected该类型或成员可以通过从 class 派生的类型访问这些类型在其包含程序集中进行声明。访问级别 1
4.静态方法和非静态方法
假设一个类是一个“房子”的蓝图。静态方法就像是这个蓝图上标注的固定信息比如房屋的总平方尺数——你不需要建造一个实际的房子实例化一个对象来获取这个信息。非静态方法则像是房子里的开关或电器你需要进入一个实际的房子创建一个对象来操作它们。
静态方法: 静态方法属于类本身而不是类的实例。因此无需创建类的实例就可以调用静态方法, 使用static关键字进行定义。
访问限制静态方法不能访问类的非静态成员。状态保持静态方法不能使用或更改非静态字段因为它们不依赖于对象状态。扩展性不能被继承或重写。用途通常用于实现不依赖于对象状态的功能例如工具函数。
非静态方法: 非静态方法属于类的实例。需要先创建类的对象然后才能调用这些方法。通常不需要特殊关键字除非用于继承或重写等特殊情况。
访问限制非静态方法可以访问类中的所有成员。状态保持可以使用或更改对象的状态字段。扩展性可以被继承和重写。用途通常用于实现依赖于或更改对象状态的功能。
5.数组、字典和其他集合类型
数组就像一列有固定数量的停车位每个停车位只能停一辆特定类型的车。列表更像一个动态的停车场可以根据需要增加或减少停车位。字典就像一个大楼的邮箱每个邮箱有唯一的标签和里面的邮件。队列就像排队等候先来的先得到服务。栈就像一叠盘子最后放上去的盘子会先被取下。散列集就像一个房间里的人每个人都是唯一的但你不能预测他们站在房间里的哪个位置。
1. 数组Array 定义方式: 使用方括号 []。 特性: 长度固定元素类型相同。 访问: 使用索引从 0 开始。 示例: int[] numbers new int[5] {1, 2, 3, 4, 5};常用操作: Length 获取长度, SetValue 和 GetValue 设置和获取值。
2. 列表List 定义方式: 使用 ListT 类。 特性: 动态大小元素类型相同。 访问: 使用索引从 0 开始。 示例: Listint numbers new Listint {1, 2, 3, 4, 5};常用操作: Add, Remove, Count, Contains。
3. 字典Dictionary 定义方式: 使用 DictionaryTKey, TValue 类。 特性: 键值对存储键唯一。 访问: 使用键。 示例: Dictionarystring, int age new Dictionarystring, int
{{Alice, 30},{Bob, 40}
};常用操作: Add, Remove, ContainsKey, TryGetValue。
4. 队列Queue 定义方式: 使用 QueueT 类。 特性: 先进先出FIFO。 访问: 不能使用索引。 示例: Queueint numbers new Queueint();常用操作: Enqueue, Dequeue, Peek, Count。
5. 栈Stack 定义方式: 使用 StackT 类。 特性: 后进先出LIFO。 访问: 不能使用索引。 示例: Stackint numbers new Stackint();常用操作: Push, Pop, Peek, Count。
6. 散列集HashSet 定义方式: 使用 HashSetT 类。 特性: 元素唯一无序。 访问: 不能使用索引。 示例: HashSetint numbers new HashSetint {1, 2, 3};常用操作: Add, Remove, Contains, Count。
总结一下
类型长度是否固定元素是否唯一是否有序可通过索引访问使用场景数组是否是是固定大小列表否否是是动态内容字典否键是否否通过键访问配置设置队列否否是FIFO否打印队列、等待列表栈否否是LIFO否撤销操作、深度优先搜索散列集否是否否停止词、唯一标识符集
6. out和ref
假设你要从一个魔法店里取出一些物品。
使用 out 就像是你给店主一个空袋子店主一定会在里面放一些东西。使用 ref 就像是你给店主一个已经有东西的袋子店主可以查看里面的东西也可以添加或更改里面的东西。
out 参数用于从方法返回多个值。使用 out 参数时
在方法内必须为 out 参数赋值。调用方法时传入的变量不需要预先赋值。
public void GetData(out int x, out string y)
{x 10;y hello;
}// 调用
int a;
string b;
GetData(out a, out b); //此时a10,bhelloref 参数用于双向传递。即
在方法内可以访问 ref 参数的初始值。在方法内可以更改 ref 参数的值该更改将反映到外部变量。调用方法时传入的变量必须预先赋值。
public void ModifyData(ref int x)
{x x * 2;
}// 调用
int a 5;
ModifyData(ref a); // a 现在是 107.属性和变量
变量也称为字段是类、结构或枚举中定义的成员用于存储数据。它们可以有访问修饰符如 public, private 等。
public class MyClass
{public int MyField; // 公有字段private string anotherField; // 私有字段
}属性提供了一种封装字段的方式允许你通过 get 和 set 访问器来控制字段的读取和写入。这有助于实现更好的数据封装和验证逻辑。
public class MyClass
{public int MyProperty_0 { get; set; }public int MyProperty_1 { get; }// 只有get没有set表示这个属性是只读public int MyProperty_2 { get; private set; } //外部不可修改//public int MyProperty_2 { set; }// 不允许只写不读//更灵活的写法private int _myField; // 私有字段public int MyProperty // 公有属性{get { return _myField; }set{if (value 0) //进行更多操作_myField value;}}
}8.构造函数
构造函数就像是产品对象出厂时的“初始化设置”过程。在这个过程中工厂构造函数会根据需求参数来设置产品对象的各种特性和功能字段和属性。
public class Person
{public string Name { get; set; }public int Age { get; set; }public Person(string name, int age) //构造函数{this.Name name;this.Age age;}
}
// 使用
Person person new Person(Alice, 30);一个类可以拥有多个构造函数这被称为构造函数的重载。
public class Person
{public string Name { get; set; }public int Age { get; set; }public string Email { get; set; }// 无参数的构造函数public Person(){Name Unknown;Age 0;Email unknownexample.com;}// 接受一个参数的构造函数public Person(string name){Name name;Age 0;Email unknownexample.com;}// 接受两个参数的构造函数public Person(string name, int age){Name name;Age age;Email unknownexample.com;}// 接受三个参数的构造函数public Person(string name, int age, string email){Name name;Age age;Email email;}
}// 使用无参数构造函数
Person person1 new Person();// 使用一个参数的构造函数
Person person2 new Person(Alice);// 使用两个参数的构造函数
Person person3 new Person(Bob, 30);// 使用三个参数的构造函数
Person person4 new Person(Charlie, 40, charlieexample.com);9.面向对象封装、继承、多态 封装Encapsulation 封装是将数据字段和相关操作方法封装在一个类中的概念。这可以通过访问修饰符如public、private、protected来实现以控制数据的访问级别防止直接访问内部数据。 这有点像手机的外壳你可以使用屏幕、按钮等接口来与手机交互但不能直接触及手机内部的电路。 例子 public class Person
{private string name;private int age;public string GetName(){return name;}public void SetName(string newName){name newName;}public int GetAge(){return age;}public void SetAge(int newAge){if (newAge 0){age newAge;}}
}
//name和age字段被封装在Person类中并通过公有方法GetName()、SetName()、GetAge()和SetAge()来访问和修改它们防止直接访问字段。继承Inheritance 允许一个类子类继承另一个类父类的成员字段和方法并且可以在子类中添加新成员或重写父类的成员。想象一下家庭中的关系孩子可以继承父母的一些遗传特征如眼睛颜色同时也可以拥有自己独特的特征。例子 public class Vehicle
{public string Make { get; set; }public string Model { get; set; }public void StartEngine(){Console.WriteLine(Engine started.);}
}public class Car : Vehicle
{public int Year { get; set; }public void Accelerate(){Console.WriteLine(Car is accelerating.);}
}
//在这个例子中Car类继承了Vehicle类的Make、Model属性和StartEngine()方法并且添加了自己的属性Year和方法Accelerate()。多态Polymorphism 允许不同的对象对相同的方法做出不同的响应。这可以通过方法重写和接口来实现。这就像电器插座适配器不同的电器可以插入同一个插座但它们在插座中的表现不同。例子 public class Animal
{public virtual void MakeSound(){Console.WriteLine(Some generic animal sound.);}
}public class Dog : Animal
{public override void MakeSound(){Console.WriteLine(Woof! Woof!);}
}public class Cat : Animal
{public override void MakeSound(){Console.WriteLine(Meow!);}
}
//Animal类有一个虚拟方法MakeSound()Dog和Cat类分别重写了这个方法使得它们可以表现出不同的声音。其中还使用virtual 和 override 关键字是一种明确的方式来声明和表达方法的重写关系有助于代码的可读性和维护性。10.接口Interface
定义方式使用interface关键字。成员只能包含方法、属性、事件和索引器的声明不能包含实现。访问修饰符所有成员自动为public不允许添加其他访问修饰符。多继承一个类可以实现多个接口。实现实现接口的类必须提供接口中所有成员的实现。
示例
1.定义接口
//假设正在开发一个绘图程序需要支持多种图形如圆形、矩形等。可以定义一个IDrawable接口
interface IDrawable
{void Draw();
}2.实现接口定义类
//定义不同的图形类如Circle和Rectangle并实现IDrawable接口
class Circle : IDrawable
{public void Draw(){Console.WriteLine(Drawing a circle.);}
}class Rectangle : IDrawable
{public void Draw(){Console.WriteLine(Drawing a rectangle.);}
}3.使用
IDrawable[] drawables new IDrawable[] { new Circle(), new Rectangle() };
foreach (var drawable in drawables)
{drawable.Draw();
}
//Drawing a circle.
//Drawing a rectangle.11.抽象类
定义方式使用abstract关键字。成员可以包含字段、方法、属性、事件和索引器。方法可以有或没有实现。访问修饰符成员可以有不同的访问修饰符public、protected等。多继承一个类只能继承一个抽象类。实现继承抽象类的子类必须实现所有抽象成员。
示例
1.定义抽象类
public abstract class Shape
{public abstract void Draw(); // 抽象方法public void Move() // 具体方法{Console.WriteLine(Moving the shape.);}
}2.继承抽象类
//定义Circle和Rectangle类并继承Shape
class Circle : Shape
{public override void Draw(){Console.WriteLine(Drawing a circle.);}
}class Rectangle : Shape
{public override void Draw(){Console.WriteLine(Drawing a rectangle.);}
}3.使用
Shape[] shapes new Shape[] { new Circle(), new Rectangle() };
foreach (var shape in shapes)
{shape.Draw();shape.Move();
}
//Drawing a circle.
//Moving the shape.
//Drawing a rectangle.
//Moving the shape.精彩推荐 【C#进阶一】C#中的数组(Array)、集合(ArrayListQueueStack, HashList)、ListT、字典(DictionaryK,T)和双向链表LinkedList 【C#进阶八】C#中的序列化与反序列化下二进制序列化、XML序列化及JSON序列化
希望有所帮助同时欢迎关注我后面将更新更多相关内容