从上往下看可能会遇到一些看不懂的知识,不会有问题,有些东西不需要刨根问底,缘分到了自然知道了
环境及IDE
Visual Stdio 2017,Microsoft官网可下,安装后模块里面选C#,控制台和windows窗口。
接下来的使用:文件->新建->项目->控制台 or Windows窗口。
最好新建在自己知道的文件夹,在新建的时候设置好名字,不然之后改很麻烦
Hello World
双击Program.cs,这个是整个项目的Class,包含一个Main方法。
namespace Text
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.ReadKey();
}
}
}
上述代码为命名空间Text里的类Program,这个类包含一个方法Main。
Console也是一个类,这里使用的是这个类中的输出函数,参数为要输出的字符串。ReadKey用于从输入流获取一个字符。
Windows窗口应用
开始是一个的窗口类型,你可以在工具箱中添加Lable标签,TextBox文本框,Button按钮等对象。
注意在添加之后的第一件事是修改名字,因为如果有方法使用了这个对象,你在之后修改名字就会出错
每个对象都有属性,分为属性和事件。属性是静态的固有的值,如颜色大小;事件为触发时生效的方法,如果单击后产生xx效果。
双击某个对象后会在"窗口.cs"和"窗口.Designer.cs"中产生对于的事件代码,此时如果只删除"窗口.cs"中的代码,vs会报错。需要去"窗口.Designer.cs"中找出这个事件的代码删除
下图为对一个按钮单击的事件:
private void btnAdd_Click(object sender, EventArgs e)
{
int num1, num2;
num1 = int.Parse(txtNumber1.Text);
num2 = int.Parse(txtNumber2.Text);
int answer = num1 + num2;
lblAnswer.Text = "运行结果为:";
lblAnswer.Text += num1+"+"+num2 + "="+answer;
}
命名规范
Pascal大小写: 每个单词的首字母大写,其它小写,用于标识类名、方法名、属性名(ProductOrder)。
Camel大小写: 首字母小写,其后每个单词的首字母大写,其它小写,用于标识局部变量、方法的参数名(backColor)。
类名用名词(Employee),方法名用动词开始(GetEmployeeName)。
常量的每个字母都大写,变量一般用Camel大小写。
基本类型
变量分为常量与变量。常量分为字面值(“aaa”)和符号常量(const int a);变量分为简单数据类型和引用类型。
所有简单数据类型有:
其他的和C语言中差不多,但是C#和java中为强类型,bool 的值为true或false,不能写if(1)一定要写if(true)
隐式转换
-
隐式转换一般在不同类型的数据进行混合运算时候发生,当编译器能判断出转换的类型,而且转换不会带来精度的损失时,C#语言编译器会自动进行隐式转换。
-
隐式转换时按数据长度增加的方向进行,以保证精度不降低,例如int型和long型运算时,先把int数据转成long型后再进行运算。
-
byte型和short型参与运算时,必须先转换成int型。
-
char 可以隐式转换为 ushort、int、uint、long、ulong、float、double 或
decimal,但是不存在从其他类型到 char 类型的隐式转换。 -
赋值时,如果右边的类型的大小大于左边类型,不能隐式赋值。
类型转换与输入输出
string转其他类型:
string x = "123";
int a = System.Convert.ToInt32(x);
int b = int.Parse(x);
其他转string:
int c = 11;
string x = c.ToString();
为什么都和string相关,因为C#中控制台的输入输出都是以string为参数。
Console.ReadLine()得到的是字符串你需要用函数转换才能赋值给int。
一维及多维数组
一维数组:
int[] A = new int[10];
int[] B = new int[] { 1, 2, 3, 4 };
int[] C = new int[4] { 1, 2, 3, 4 };
int[] D; D = new int[10];
数组其实是System.Array类,包含以下方法和成员:
- Length /属性返回数组长度。
- Max()和Min()方法 /返回数组中的最大小值
- Clear /清除数组元素的值
- Copy /复制数组
- Sort /对数组排序
- Reverse /反转数组元素的顺序
- IndexOf /从左至右查找数组元素
- LastIndexOf /从右到左查找数组元素
- Resize /更改数组长度
//以sort为例
//Array.Sort(int[]) or
//Array.Sort(int[],pos,length) or
//Array.Sort(int[],pos,length,comparer)
int[] a = new int[20];//默认为0
for (int i = 0; i <= 19; i++) a[i] = 20 - i;
Array.Sort(a, 1, 5);
for (int i = 0; i <= 19; i++) Console.Write(a[i] + " ");
多维数组:
学过C的会好理解一些,一个n维的数组可以看成一个数组元素为n-1维数组的数组
int[][] A = new int[20][];//数组创建必须有第一维的size
int[][] B = new int[][] { new int[20], new int[18], new int[20] };
int[,] C = new int[,] { { 1, 2, 3 }, { 6, 7, 10 }, { 1, 4, 5 } };
//此法多个一维数组应该相同长度
-
第一种方法
int[][] A = new int[20][];
只说明了A是一个方有20个一维数组的数组,必须要A[0]=new int[10]
后才能使用A[0][4]
-
可以将A[0]当作一维数组使用
n维数组:
int[][][][][] A = new int[20][][][][];
int[][][][][] B = new int[][][][][] { new int[15][][][], new int[16][][][] };
int[,,,,] C = new int[,,,,]
{ { { { { 1, 2 }, { 3, 4 } }, { { 1, 2 }, { 3, 4 } } }, { { { 1, 2 },
{ 3, 4 } }, { { 1, 2 }, { 3, 4 } } } },
{ { { { 1, 2 }, { 3, 4 } }, { { 1, 2 }, { 3, 4 } } }, { { { 1, 2 },
{ 3, 4 } }, { { 1, 2 }, { 3, 4 } } } } };
String类
- String是对内存中的字符串的调用,为多个Unicode字符的组合,字符串之间可以用‘+’连接,用"==“和”!="比较
- 字符串只读,虽然你可以对它进行重新赋值,连接等操作,但是不能通过索引器修改内容(x[0]=‘a’)。可以转成char[]再修改。
- 和字符数组的转换:char[] charArr = name.ToCharArray();不以\0结束
- 包含以下方法和成员:
- Length,返回字符串的长度
- IndexOf、LastIndexOf,第一,最后个子串的位置
- Insert,插入一个字符串
- Remove,删除若干字符
- Replace,替换
- Split,转换为字符串数组
- Substring,求子串
- Trim,去掉首尾空格
a.IndexOf("abc")第一次出现这个子串的位置
a.LastIndexOf("abc")最后一次出现这个子串的位置
b=a.Insert(2,"kk");插入
b=a.Replace("aa","bb");所有aa变成bb
a.Trim()去首尾空格TrimStart TrimEnd
//以Split为例
static void Main(string[] args)
{
Console.WriteLine("请输入一些人的名字:");
string Names = Console.ReadLine();
char[] separator = new char[] { ',', ' ', ',', ';', ';' };
string[] Name = new string[100];
Name = Names.Split(separator);
int counter = 0;
foreach(string name in Name)
{
if (name[0] == '张') counter++;
}
Console.WriteLine("这些人中有{0}个姓张。",counter);
Console.ReadKey();
}
//张三,桑,阿三,张阿三,阿三,里阿三,张阿三
foreach(类型 变量 in 集合)
foreach(int xxx in a)//int[] a
对象与类
任何事物可以看成对象,对象具有:数据(型号,性别),行为(加速,旋转)
数据用“字段(Field)”来实现,行为用“方法(Method)”来实现
如果一些对象具有相同种类的数据和行为(都有身高,都可以走路),那么我们不需要一个一个去写他们的代码,只需要用类(Class) 去表示这一组对象。类为他们统一的抽象描述。
抽象、封装、继承与多态
抽象:
只抽象出与当前目标相关的,忽略其他的(要考虑汽车的加速度时,不需要考虑汽车的颜色)
封装:
将相关数据和和操作封装在一个对象中,互不干扰,且可以将信息隐藏,只对外留下接口
继承与多态:
一个新类可以继承之前的类,获得那个类的所有功能,新类在此基础上可以添加新的功能
私有字段与属性
[访问修饰符] class 类名 [:基类]
{
//类的成员;
}
public class Student //类名,Pascal大小写
{
string name;//字段,Camel大小写
}
Student a = new Student();
公有字段会暴露了内部的细节,且外部修改可能会出现无效数据。所以字段一般修饰为private,外界无法访问
除了方法外,C#提供属性来访问私有字段
public class Student
{
private string name;//字段,Camel大小写
public string Name //属性,一般为字段对应的Pascal大小写
{
get { return name;}
set { name = value;}
//value为外部赋值进来的数据
}
}
string x = "aa";
Student a = new Student();
a.Name = x;
Console.WriteLine(a.Name);
访问修饰符
访问修饰符 | 意 义 |
---|---|
public | 访问不受限制,可以类内和任何类外的代码中访问 |
protected | 可访问域限定于类内或从该类派生的类内 |
internal | 可访问域限定于类所在的程序集内 |
protected internal | protected或者internal,即可访问域限定于类所在的程序或那些由它所属的类派生的类内 |
private | 可访问域限定于它所属的类内 |
命名空间(namespace)
隐式地具有public访问性,且不允许有访问修饰符。
类(class)
构造函数默认为public访问修饰符。
析构函数不能显示使用访问修饰符且默认为private访问修饰符。
类的成员默认访问修饰符为private。
结构(struct)
结构成员默认为private修饰符。
结构成员无法声明为protected成员,因为结构不支持继承。
接口(interface)
默认访问基本为internal;但是如果在其他public类中使用时,必须为public。