理论知识固然重要,但是只读理论往往是枯燥的,只有通过不断的实践和探索,才能更高效的进行学习。
目录
2.windows窗口应用输出hello world(winforms)
1.类的三大成员(初学可以在实例中慢慢摸索,没必要一开始就花太多时间去深究理论)
2.类与命名空间的使用(创建一个.net framework控制台应用 )
一、开发环境准备
1.下载visual studio
社区版对于个人使用免费,用于学习以及个人项目开发够用了
当然有心人花点心思也可以白嫖专业版
二、从hello world开始学习c#
1.控制台程序输出hello world
选择新建一个项目
按需求分类后选择对应开发环境
开始写代码
代码如下:
using system;
namespace sayhello {
class sayhello {
static void main(string[] args) {
console.writeline("hello world");
console.readkey();
}
}
}
单击f5进行调试运行
ctrl + f5进行不调试运行
2.windows窗口应用输出hello world(winforms)
创建windows窗口应用
点击后等待
实现代码:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
namespace winformsapp1
{
public partial class form1 : form
{
public form1()
{
initializecomponent();
}
private void form1_load(object sender, eventargs e)
{
}
private void button1_click(object sender, eventargs e)
{
textshowhello.text = "hello world" ;
}
}
}
实现效果:
实现原理:
3.wpf应用程序输出hello world
创建wpf应用程序
注意:wpf也被看做winforms的升级版
记得给控件取名字 (养成良好习惯)
为button控件添加事件
点击闪电图标进入事件栏 ,双击click创建点击事件
在方法中写代码实现点击事件
实现代码:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows;
using system.windows.controls;
using system.windows.data;
using system.windows.documents;
using system.windows.input;
using system.windows.media;
using system.windows.media.imaging;
using system.windows.navigation;
using system.windows.shapes;
namespace wpfapp2
{
/// <summary>
/// interaction logic for mainwindow.xaml
/// </summary>
public partial class mainwindow : window
{
public mainwindow()
{
initializecomponent();
}
private void buttonsayhello_click(object sender, routedeventargs e)
{
textshowhello.text = "hello world";
}
}
}
实现效果:
单击按钮输出hello world
三、初步认识类和命名空间
类(class):构成程序的主体,是现实世界事物的模型
命名空间(namespace):以树型结构组织类(和其他类型)
类与对象的关系:对象(实例),就是类的实例化,类是一个概念,而对象就是存在概念中的个体,比如动物是一个概念也就是一个类,而狗就是一个对象,猫也是一个对象,你可以说狗和猫是动物,但是你不能说动物一定就是狗和猫。
1.类的三大成员(初学可以在实例中慢慢摸索,没必要一开始就花太多时间去深究理论)
属性(property):属性用于封装对象的状态。
方法(method):方法用于封装对象的行为和功能。
事件(event):事件用于实现观察者模式,实现对象间的松耦合通信。
2.类与命名空间的使用(创建一个.net framework控制台应用 )
在一个项目中,我们会创造很多的类,同时也会使用很多官方已经定义好的类,在vs中类被靓青色标识
例如:
引用system命名空间时:
using system ;
namespace helloworld {
class hello {
static void main(string[] args) {
console.writeline("图书馆里有什么?");
console.writeline("《红楼梦》");
console.writeline("《西游记》");
console.writeline("《水浒传》");
console.writeline("《三国演义》");
}
}
}
未引用system命名空间:
//using system ;
namespace helloworld {
class hello {
static void main(string[] args) {
system.console.writeline("图书馆里有什么?");
system.console.writeline("红楼梦?");
system.console.writeline("西游记?");
system.console.writeline("水浒传?");
system.console.writeline("三国演义?");
}
}
}
错误使用时:
将鼠标焦点放在红色波浪线上按alt + enter 或者点击带红叉的小灯泡
查看错误信息,选择解决方案
3.命名空间中的类冲突
引用命名空间的意义在于简化开发避免类名冲突,不同的命名空间可能包含相同的类名,指定不明就会引起冲突
如果同时引用命名空间system.windows.shapes与system.io
如果不使用的命名空间请不要引用,避免类冲突。
4.类库的引用
类库引用是使用命名空间的物理基础
引用可分为两类:dll引用(黑盒,无源码)、项目引用(白盒,有源码)
四、c#语言基本元素
1.关键字(keyword)
关键字是具有特殊含义和功能的固定标识符,例如定义类、方法、变量、控制流等
这里举例几种较为常见的关键字
class 用于定义类 | new 用于创建新的对象实例 |
void 表示一个方法不返回任何值 | int、string、double等表示基本数据类型 |
static 修饰符,用于指定对象是静态的即属于类而非对象 | public、private、protected 用于定义类成员的访问权限 |
this 表示当前对象的引用 | base 表示基类的引用 |
if、else、switch、case 条件语句和选择语句 | for、while、do-while 循环语句 |
return 返回值 | try、catch、finally 异常处理 |
interface 用于定义接口 | enum 用于定义枚举类型 |
delegate 用于定义委托类型 | event 用于定义事件 |
using 用于导入命名空间或释放资源 | namespace 用于定义命名空间 |
sealed、abstract 用于限定类的继承特性 | override 用于在派生类中重写基类成员 |
除了列举的这些关键字外,通过msdn可以查询到所有的关键字,按照需求可以精确的了解对应关键字具体有什么作用。(想要做到精通c#,那就把c#字典给过几遍)
2.运算符(operator)
运算符在开发中的运用极深,理解每一个运算符的含义和用法是非常有必要的
这里列举msdn中所展示的运算符
x.y | 成员访问 |
f(x) | 方法和委托调用 |
a[x] | 数组索引器访问 |
x ++ | 后递增 |
x - - | 后递减 |
new t(...) | 对象和委托创建 |
new t(...){...} | 具有初始化设定项的对象创建 |
new {...} | 匿名对象初始值设定项 |
new t[...] | 数组创建 |
typeof(t) | 获取t的 system.type 对象 |
checked(x) | 在已检查的上下文计算表达式 |
unchecked(x) | 在未检查的上下文计算表达式 |
default(t) | 获取类型t的默认值 |
delegate{} | 匿名函数(匿名方法) |
+ x | 标识 |
- x | 求反 |
! x | 逻辑求反 |
~ x | 按位求反 |
++ x | 前递增 |
-- x | 前递减 |
(t) x | 将x显式转换为t |
* | 乘法 |
/ | 除法 |
% | 取余 |
x + y | 相加、字符串串联、委托组合 |
x - y | 相减、委托移除 |
x << y | 左移 |
x >> y | 右移 |
x < y | 小于 |
x > y | 大于 |
x >= y | 大于或等于 |
x <= y | 小于或等于 |
x is y | 如果x是t,则返回true,否则返回false |
x as y | 返回类型为t的x,如果x不是t,则返回null |
x == y | 等于 |
x != y | 不等于 |
逻辑“与” | x & y | 整型按位“与”,布尔型逻辑“与” |
逻辑“异或” | x ^ y | 整型按位“异或”,布尔型逻辑“异或” |
逻辑“或” | x | y | 整型按位“或”,布尔型逻辑“或” |
短路“与” | x && y | x y必须全为true,方法才会运行 |
短路“或” | x || y | x y有一个为true,则方法正常运行 |
null合并 | x ?? y | 如果x为null则计算结果为y,反之计算结果为x |
条件运算 | x ?: y : z | 如果x为true则计算结果为y,反之计算结果为z |
x = y | 赋值,x = y不是x等于y而是把y的值给x |
x op= y | 复合赋值。支持这些运算符:+=、-=、*=、/=、%=等 |
(t x) => y | 匿名函数(lambda表达式) |
3.标识符(identifier)
标识符是用来表示变量、类、方法、属性等各种程序实体的名称
注意事项:
1.标识符可以包括字母、数字、下划线(_)
2.标识符不能以数字开头
3.在关键字前使用@可以作为标识符
4.标识符的定义最好有含义
5.标识符区分大小写,例如myname和myname,这是两个标识符
6.驼峰命名法:大驼峰命名法,所有单词首字母大写。
小驼峰命名法,第一个单词首字母小写,后续单词首字母全部大写
7.标识符不能包含除下划线_以外的如何符号或空格
8.不能与c#类库名称重名
4.标点符号
标点符号不参与运算
分号; | 用于表示语句的结束,每条语句必须用分号结束 |
大括号{} | 用于标识代码块的开始和结束,大括号里面的代码被视为独立的代码块 |
小括号() | 用于包裹方法、属性、条件语句等的参数和表达式 |
方括号[] | 用于定义数组或访问数组中的元素 |
尖括号<> | 用于表示泛型类型的参数或表示类型约束 |
逗号, | 用于分隔多个参数、数组元素以及在声明语句中初始化变量时分隔不同的值 |
冒号: | 用于表示继承、实现接口、标签标识以及在switch语句中定义case |
点号. | 用于访问对象的成员,如方法、属性、字段等 |
引号 双引号 ' ' " " | 用于表示字符字面量和字符串字面量 |
反引号` | 用于表示字符串字面量或定义verbatim字符串 |
5.数据类型
数据类型用于声明变量的类型,指定存储数据的方式以及可执行的操作
sbyte | -128 至 127 | 有符号8位整数 |
byte | 0 至 255 | 无符号8位整数 |
char | u+0000 至 u+ffff | 16位unicode字符 |
short | -32768 至32767 | 有符号16位整数 |
ushort | 0 至 65535 | 无符号16位整数 |
int | -2147483648 至 2147483647 | 有符号32位整数 |
uint | 0 至 4294967295 | 无符号32位整数 |
long | -9223372036854775808 至 9223372036854775807 | 有符号64位整数 |
ulong | 0 至 18446744073709551615 | 无符号64位整数 |
float | +-1.5e-45 至 +-3.4e38 | 7位 |
double | +-5.0e-324 至 +-1.7e308 | 15 至 16位 |
bool | 只有两个值,true为真,false为假 |
char | 引号中只能有一个字符如‘a’、‘2’、‘g’ |
string | 可包含零个或多个字符的序列,最大长度约为15亿个字符(在.net framework中) |
这里只介绍一部分数据类型,详细的资料按需要查询msdn
6.注释
注释是程序员开发过程中对开发进度以及代码功能的解释
做项目不写注释容易被刺杀。养成好习惯,代码跑到哪注释写到哪
注释分为单行注释和多行注释(块注释)
注释的快捷键:
1.点击工具,选择选项
2.点击键盘,搜索注释,找到注释选中行以及取消注释选中行
3.设置快捷键
7.var定义类型
利用var定义的值会被c#自动编译为对应类型
实现代码:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
namespace consoleapp2
{
class program
{
static void main(string[] args)
{
var a = 58;
console.writeline(a.gettype().name);
console.writeline(a.gettype().fullname);
console.writeline(a.gettype().namespace);
console.writeline(a.gettype().assembly);
console.readline();
}
}
}
实现效果:
实现解析:
8.变量(成员变量)
变量是用于存储和操作数据的一种命名标识符
声明变量:
变量类型 变量名 ;
变脸类型 变量名 = 变量值 ;
需要注意的是当声明变量没指定值时,系统会给变量一个初始值
整数类型(int、long、short、byte等):初始值为0
浮点数类型(float、double):初始值为0.0
布尔类型(bool):初始值为false
字符类型(char):初始值为'/0'
引用类型(string、类、接口、委托等):初始值为null
9.修饰符
修饰符是用于改变类、成员、方法、属性等的行为和访问级别的关键字
访问修饰符:
public
10.方法(成员函数)
将逻辑代码封装起来,能够反复调用,用来执行特定任务
访问修饰符 数据类型 方法名(参数){
功能代码 ;
return 返回值 ;
}
实例一:加法运算(有参数,有返回值)
实例二:日期打印(无参数,有返回值)
实例三:语句输出(无参数,无返回值)
五、 c#基础方法知识
1.方法的由来
- 方法(method)的起源需要追溯到早期的编程语言,如高级语言c/c++中的函数(function)即为方法的前身。
- 方法是面向对象范畴的概念,在非面向对象语言中仍然称为函数。
举个例子:
(1).用c语言创建一个函数:
1.创建c++空项目
2. 在右侧源文件中创建项目
将默认的后缀cpp(c++后缀)改为c(c语言后缀)
代码实现
#include <stdio.h>
double add(double a,double b)
{
return a + b ;
}
int main()
{
double q = 14 ;
double w = 16 ;
double result = add(q,w);
printf("%f+%f=%f",q, w, result);
return 0 ;
}
实现结果:
(2).用c#创建方法:
实现结果:
代码实现:
using system;
namespace cmethod {
class program {
static void main(string[] args)
{
calculator calculator = new calculator();
console.writeline(calculator.getcirclearea(10));
console.writeline(calculator.getcylindervolume(10,10));
console.writeline(calculator.getconevolume(10,10));
}
}
class calculator {
public double getcirclearea(double r) {
return 3.14 * r * r;
}
public double getcylindervolume(double r,double h) {
return 3.14 * r * r * h;
}
public double getconevolume(double r, double h) {
return 3.14 * r * r * h / 3;
}
}
}
c#中的函数不能独立于类(或结构体)之外
2.方法的复用
using system;
namespace cmethod {
class program {
static void main(string[] args)
{
calculator calculator = new calculator();
console.writeline(calculator.getcirclearea(10));
console.writeline(calculator.getcylindervolume(10,10));
console.writeline(calculator.getconevolume(10,10));
}
}
class calculator {
public double getcirclearea(double r) {
return math.pi * r * r ;
}
public double getcylindervolume(double r,double h) {
return getcirclearea(r) * h ;
}
public double getconevolume(double r, double h) {
return getcylindervolume(r,h) / 3 ;
}
}
}
3.方法的重载
方法重载在c#与java中的运用相当广泛,便于扩展且便于理解。
方法运用:
实现代码:
using system;
namespace cmethod {
class program {
static void main(string[] args)
{
//相同的方法名,传入不同的参数,实现不同的效果
method m = new method();
console.writeline(m.add(500,20));
console.writeline(m.add(1000,300,14));
console.writeline(m.add("我是add方法!"));
}
class method {
//定义一个名称为add,参数类型为int,int的方法
public int add(int a, int b) {
return a + b ;
}
//定义一个名称为add,参数类型为int,int,int的方法
public int add(int a, int b,int c)
{
return a + b + c ;
}
//定义一个名称为add,参数类型为string的方法
public string add(string a) {
return a;
}
}
}
}
常见错误:
4.构造器(构造函数)
构造器分为两种,一种是有参构造一种是无参构造。在调用一个类时,如果你没有去声明构造,那么系统将默认使用无参构造。
默认使用的构造:
创建有参、无参构造各一个
5.操作符(运算符)
在笔记的第四章我们简单引用了msdn中对于运算符的定义以及运算符的使用,接下来我将再次列出c#中常用的运算符及其描述
操作符(operator)、操作数(operand)
类别 | 运算符 | 使用介绍 |
赋值运算符 | = | 简单赋值运算符,用于将右侧的值赋值给左侧的变量 |
基本操作符 | . | 主要用于访问对象的成员,包括数据成员、方法以及命名空间或类型中的成员 |
() | 方法调用操作符允许你传递参数给方法,并执行该方法所定义的代码 | |
[] | 通常用作数组或列表的索引操作符,用于访问、修改或添加数组或列表中的元素 | |
typeof | 用于检测一个变量或表达式的数据类型 | |
default | 大部分时候作为默认值存在 | |
new | 用于创建对象实例 | |
checked | 用于整数运算及溢出检测有关 | |
unchecked | 用于整数运算及溢出检测有关 | |
sizeof | 用于计算变量/数据类型在当前系统中占用内存的字节数 | |
-> | ![]() | |
算法运算符 | + | 加法运算符,用于两个数相加 |
- | 减法运算符,用于两个数相减 | |
* | 乘法运算符,用于两个数相乘 | |
/ | 除法运算符,用于两个数相处 | |
% | 取余运算符,用于两个数相处后取其余数 | |
++ | 自增运算符,用于将变量值加1(前缀、后缀) | |
-- | 自减运算符,用于将变量值减1(前缀、后缀) | |
比较运算符 | == | 等于运算符,用于比较两个值是否相同 |
!= | 不等运算符,用于比较两个值是否不相同 | |
> | 大于运算符,用于比较左侧的值是否大于右侧的值 | |
< | 小于运算符,用于比较右侧的值是否小于右侧的值 | |
>= | 大于等于运算符,用于比较右侧的值是否大于或等于左侧的值 | |
<= | 小于等于运算符,用于比较右侧的值是否小于或等于左侧的值 | |
is | 类型转换操作符,用于类型转换和类型兼容性检查 | |
as | 类型转换操作符,用于类型转换和类型兼容性检查 | |
逻辑运算符 | && | 逻辑与运算符,用于判断两个条件是否都为真 |
|| | 逻辑或运算符,用于判断两个条件是否有一个为真 | |
! | 逻辑非运算符,用于对条件取反 | |
位运算符 | & | 位与运算符,用于比较两个数的二进制表示,并返回一个新的数,其每个位进行“与”运算的结果 |
| | 位或运算符,用于比较两个数的二进制表示,并返回一个新的数,其每个位进行“或”运算的结果 | |
^ | 位异或运算符,用于比较两个数的二进制表示,并返回一个新的数,其每个位都是两个操作数对应进行“异或”运算的结果 | |
~ | 位非(取反)运算符,用于对一个数的二进制表示进行“非”运算,即翻转每个数 | |
<< | 左移运算符,用于将一个数的二进制表示向左移动指定的位数 | |
>> | 右移运算符,用于将一个数的二进制表示向右移动指定的位数 | |
其他运算符 | ?: | 条件(三元)运算符,根据条件选择两值个中的一个 |
&x | 取地址操作符,用于变量的内存地址 | |
*x | 取引用操作符 | |
(t)x | 强制类型转换 | |
复合赋值运算符 | += | 加等于运算符,用于将右侧的值加在左侧的变量上,并将结果赋值给左侧的变量 |
-= | 减等于运算符,用于将左侧的变量减去右侧的值,并将结果赋值给左侧的变量 | |
*= | 乘等于运算符,用于将左侧的变量乘以右侧的值,并将结果赋值给左侧的变量 | |
/= | 除等于运算符,用于将左侧的变量除以右边的值,并将结果赋值给左边的变量 | |
%= | 模(余)等于运算符,用于将左侧的变量和右侧的值取余,并将结果赋值给左侧的变量 | |
&= | 位与等于运算符,用于将左侧的变量和右侧的值进行位与运算,并将结果赋值给左侧的变量 | |
|= | 位或等于运算符,用于将左侧的变量和右侧的值进行位或运算,并将结果赋值给左侧的变量 | |
^= | 位异或等于运算符,用于将左侧的变量和右侧的值进行位异或运算,并将结果赋值给左侧的变量 | |
<<= | 左移等于运算符,用于将左侧的变量的二进制表示向左移动右侧指定的位数,并将结果赋值给左侧的变量 | |
>>= | 右移等于运算符,用于将左侧的变量的二进制表示向右移动左侧指定的位数,并将结果赋值给左侧的变量 |
6.表达式
(1).c#中表达式的分类
1.任何可以得到值的运算
2.命名空间
3.类型
4.方法组
5.空值
6.匿名函数
7.属性访问
8.事件访问
9.索引器访问
10.对返回值为void的方法的调用(没有任何返回值)
(2). 语句说明
1.声明语句
2.表达式语句
3.块语句(简称"块")
4.选择(判断、分支)语句
5.迭代(循环)语句
6.跳转语句
7.try...catch...finally语句
8.using语句
9.yield语句
10.checked/unchecked语句
11.lock语句(用于多线程)
12.标签语句
13.空语句
发表评论