c#学习笔记

hello world

console

下面代码可以在小黑窗中打印出”Hello, World!”

1
Console.WriteLine("Hello, World!");

wpf

在选择工具箱中的textbox和button等搭建好窗体样式,并且给窗体相关元素命名设置后,双击要添加事件加入代码:

1
2
3
4
5
private void Button_Say_Hello(object sender, RoutedEventArgs e)
{
show_hello.Text = "hello,world!";
}
//函数为自动生成,填写里面内容即可,这里textbox的Name为show_hello

win form

与wpf基本一致。不过name属性可以在右面直接修改。

初识类与名称空间

简要认识

1
2
3
4
5
6
7
8
9
10
11
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("hellowolrd");
}
}
}

如上。c#是完全面向对象的一门语言,main这些都包含在类内(如上面代码的Program,Consle都是类,Program为自己命名的类,Console为微软自带的类)。namespace后面跟着的就是名称空间(上面为HelloWorld),别人引用自己写的类时候就可以通过名称空间很方便地引用。在引用名称空间的时候,使用using my_namespace格式,如上图用到了using System,就可以使用System里面的Console类。

如果没有using引用名称空间,也可以采用下面方法直接调用:

1
2
3
4
5
6
7
8
9
10
namespace HelloWorld2
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("hellowolrd");
}
}
}

最终效果和之前完全一样,在小黑窗中输出hellowolrd。这种叫完全限定名,可以用using关键字来进行简化。

注意,引用命名空间可能发生类名冲突的问题,所以不要一股脑把所有都引用进来。

类库的引用

类库引用是使用名称空间的物理基础,不同技术类型的项目会引用不同的类库。在vs的依赖项中可以右键添加想要引用的类库(.dll文件),然后就可以引用这个类库了(using + 类库名,如using System;)。

无源代码(黑盒引用):dll引用

在引用类库的时候,可能会由于一个类库引用了更底层的类库,导致需要不断引用来让程序不报错。所以引用的时候可以用NuGet(在右键添加那里就可以看见),这样就可以一键引用进来了。

有源代码(白盒引用):项目引用

在右边最上边解决方案添加现有项添加进来后,就可以在添加依赖项里面引用到相对应的项目了。如下图,就引用了自己写的类库my_tools。

image-20230130183544451

image-20230130183621039

依赖关系

类或对象之间存在耦合关系,优秀的程序追求“高内聚,低耦合”。

类、对象、类成员简介

类与对象的关系

1
2
3
4
5
6
using System.Windows.Forms;
Form myForm; //声明引用变量。其中类是Form,自己创建的变量是myForm。
myForm = new Form(); //将新实例化的Form对象用new关键字交给myForm变量。
myForm.text = "hello world!";
myForm.ShowDialog(); //这时候就可以用Form的方法进行操作了。
//注:以上为刘老师旧版教程例子,新版自己实践暂没有找到form。。

注意可以“多个孩子牵着同一个气球”,如下:

1
2
3
4
Form myForm1;
Form myForm2;
myForm1 = new Form();
myForm2 = myForm1; //此时myForm2和myForm1是同一个实例化对象。

类的三大成员

属性(Property)

属性:存储数据,组合起来表示类或对象当前的状态。

方法(Method)

方法:由函数进化而来,表示类或对象“能做什么”。工作中90%时间在和方法打交道,因为它是真正做事、构成逻辑的成员。

事件(Event)

事件:类或对象通知其他类或对象的机制,为c#特有(java通过其他方法实现这个机制)。善用事件机制非常重要。

语言基本元素概览、初识类型、变量与方法、算法简介

和其他编程语言非常相似,具体可以去看文档。下面是一些例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Caculator num = new Caculator();
int result = num.Add(5, 6);
Console.WriteLine(result); //最终输出结果,11
string today = num.Today();
Console.WriteLine(today); //输出今天日期
num.PrintSum(3, 4); //直接调用PrintSum,没有返回值,打出3+4的结果7

class Caculator //注意这个要放在下面才行,放最上面会报错
{
public int Add(int a, int b)
{
return a + b;
}
public string Today()
{
int day = DateTime.Now.Day;
return day.ToString();
}
public void PrintSum(int a, int b) //这里没有返回值,所以用void
{
int result = a+ b;
Console.WriteLine(result);
}
}

一个简单递归实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MyClass a = new MyClass();
int res = a.SumToOne(100);
Console.WriteLine(res); //输出了从1一直加到100的结果。

class MyClass
{
public int SumToOne(int num)
{
if (num == 1)
{
return 1;
}
else
{
int result = num + SumToOne(num - 1);
return result;
}
}
}

详解类型、变量与对象

类型(Type)

类型(Type)又名数据类型(Data Type),是数据在内存中存储时候的“型号”。c#是一门强类型语言。

1
2
int a = 5;
a = 5L; //和c语言很像,c#也是强类型语言,给int类型a赋值long型的时候会报错。

不过c#语言有对弱类型/动态类型的模仿可以达到和弱类型相似效果。

1
2
3
4
5
6
dynamic myVar = 100;
Console.WriteLine(myVar);
myVar = "Hello,world!";
Console.WriteLine(myVar);
//dynamic关键字和js里var很像,可以让c#有类似弱类型效果。以上100和Hello,world!均可以正确打出。
//c#的var虽然可以赋值任意类型,但是赋值后类型就确定了,不可以再改变类型赋值。dynamic才有js的var那样效果。

c#的五大数据类型

类(classes):如Window, Form, Consle, String

结构体(Structures):如int32, int64, single, double

枚举(Enumerations):如HorizontalAlignment, Visibility

接口(Interfaces)

委托(Delegates)

上面的五种,类、接口和委托,合称为引用类型(Reference Type),结构体和枚举,合称为值类型(Value Type)。

image-20230201153449027

暂时停止更新

跑去玩unity去了。。而且这学期课程有c#,先听老师讲咧,以后有时间再回来听刘老师的课程。