C# 程序设计引导知识
关键字理解
var
c#中var的用法
一、VAR 是3.5新出的一个定义变量的类型,其实也就是弱化类型的定义,VAR可代替任何类型,编译器会根据上下文来判断你到底是想用什么类型的。
二、至于什么情况下用到VAR 我想就是你无法确定自己将用的是什么类型,就可以使用VAR 类似 OBJECT,但是效率比OBJECT高点。
三、使用var定义变量时有以下四个特点:
1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式:
var s;
s = “abcd”;
2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3. var要求是局部变量。
4. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。
四 、var 关键字的常见用途是用于构造函数调用表达式。
1.使用 var则不能在变量声明和对象实例化中重复类型名称,如下面的示例所示:
var xs = new List();
2.从 C# 9.0 开始,可以使用由目标确定类型的 new 表达式作为替代方法:
List xs = new();
List? ys = new();
3.下面的示例演示两个查询表达式。 在第一个表达式中,var 的使用是允许的,但不是必需的,因为查询结果的类型可以明确表述为 IEnumerable。 不过,在第二个表达式中,var 允许结果是一系列匿名类型,且相应类型的名称只可供编译器本身访问。 如果使用 var,便无法为结果新建类。 请注意,在示例 #2 中,foreach 迭代变量 item 必须也为隐式类型。
// Example #1: var is optional when
// the select clause specifies a string
string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
var wordQuery = from word in words
where word[0] == 'g'
select word;
// Because each element in the sequence is a string,
// not an anonymous type, var is optional here also.
foreach (string s in wordQuery)
{
Console.WriteLine(s);
}
// Example #2: var is required because
// the select clause specifies an anonymous type
var custQuery = from cust in customers
where cust.City == "Phoenix"
select new { cust.Name, cust.Phone };
// var must be used because each item
// in the sequence is an anonymous type
foreach (var item in custQuery)
{
Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}
C# 的程序架构
C# 命名空间表示域,控制着域内的对象。
第一等级:命名空间;
第二等级:数据类型:
值类型:结构struct、枚举enum
引用类型:class,delegate,interface
第三等级:方法,属性,字段,索引,事件,常量,构造函数,终结器,嵌套类型,运算符。
在写代码时,注意级别,不要越级。
上面三个等级都包含在全局命名空间内,当类写在命名空间外时,默认的命名空间就是全局命名空间,
1. 访问修饰符
1). 有4个访问修饰符:
private :只有当前类可用
protected :当前类和后代可用
internal :当前项目可用
public: 访问不受限制
2). 放在哪里?
| 访问修饰符 | 数据类型前面 | 数据类型的成员前面 |
|---|---|---|
| private | 不能 | OK【默认】 |
| protected【重点】 | 不能 | OK |
| internal | OK[默认] | OK |
| public | OK | OK |
3)base的作用,调用父类的构造方法和父类的其它成员(包括protected访问类型的成员。
using System;
// 子类要调用父类中protected的成员,要用base.或者直接写名字调用。
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
//Animal animal = new Animal();
Dog dog = new Dog();
dog.CallAnimal();
}
}
class Animal
{
public void Eat()
{
Console.WriteLine("the Animal eats");
}
protected void Bark()
{
Console.WriteLine("the Animal barks");
}
}
class Dog:Animal
{
public void CallAnimal()
{
base.Eat();
Bark();
}
}
}
输出结果为:

2种代码复用的方式
继承:代码复用的基本方式。子类拥有所有父类的非私有成员。
note:构造函数不能继承。
attention:创建子类时,自动调用父类的构造函数,并且父类中的先执行
组合:代码复用的基本方式
**共性:**代码复用;
不同:
继承可以代码复用,也能概念复用; 缺点:耦合度高。
组合仅仅是代码复用,不能够概念复用。【整体,部分】 优点:耦合度低。
原则:使用组合而非继承 (复用的最佳实践)。因为耦合度低。但也要具体问题具体分析。
语法:
继承:
组合:class A {B b;}
实际问题的处理:
技巧 A B 1)is 判断 继承
2)is 不成立 has 判断成立 组合
动物 狗
人 大腿
输入控制 马达
面向对象的设计原则
面向对象的设计原则【学oop之前了解 之后掌握】
把名称记住!
1开-闭原则 (目标) :对扩展开放,对修改关闭
理想化的目标!
需求1:写了一段代码【类,组件,系统】
game1 类Class1:F1,F2
需求2:game2 类F1,F2,F3 怎么办?
方法1:打开类Class1,增加一个F3
方法2:继承 Class2:Class1{F3}
接口,组合,………
有的总是需要 对原来的做一定的修改!
移动互联网:手机 手机操作系统
Ios之前,微软早就有了 mobile》WP7 8
2类的单一职责(一个类的定义)
设计,抽象得到的类:功能不要太多,越少越好,
功能多,功能属于同一类别的功能
学生:上课,听课,考试,讲课【晨讲】争议?
老师:讲课,备课!
一个类有且只有一个改变它的原因【少】 易复用,易维护!
3面向接口编程而非面向实现 (写一个类时从哪入手)
先做好一个好对外的接口(公有的方法),实现不是第一步要思考.
先思考做什么,为其他的组件提供什么功能,而不是去先思考功能的实现
4使用组合而非继承 (复用的最佳实践)
如果仅仅为了复用优先选择组合复用,而非继承复用。
组合的耦合性对继承低
5依赖倒置 ( 依赖抽象)
客户端代码尽量依赖抽象的组件,因为抽象的是稳定的。实现是多变的。
6里氏替换 (继承后的重写)
父类出现地方可以被子类替换掉。要保护替换前的原有的工作,在替换后依然保持不变
子类在重写父类方法时,尽量选择扩展重写。
7接口隔离 (功能拆分)
尽量定义小而精的接口,少定义大而全的接口
小接口之间功能隔离,实现类需要多个功能时可以选择多实现.或接口之间做继承
8迪米特法则 (类与类交互的原则)
不要和陌生人说话【原则】
类与类交互时,在满足功能要求的基础上,
传递的数据量越少越好.因为这样可能降低耦合度,便于替换 class1 一个调用 class2
1) 男孩子 伙伴
2) 软件中:方法调用少;参数越少越好 F1 F2(int)(int,string,int)
追求的目标:代码低耦合 好!便于替换
高耦合 两个对象 头 躯干 连接 脖子 复杂 人真人
低耦合 假人:玩具,芭比娃娃 换头!
本文主要介绍了C#的关键字var的用法,包括其特点和应用场景。此外,讨论了C#的程序架构,包括命名空间、访问修饰符以及代码复用的两种方式——继承和组合,并强调了面向对象设计原则的重要性,如开闭原则、单一职责原则等。
1249

被折叠的 条评论
为什么被折叠?



