.lsn .csproj
sln: solusion 解决方案
csproj: c sharp project C#项目
解决方案是项目的集合,项目是文件的集合;一个sln中可以包含多个csproj。一个csproj可以包含多个文件;csproj可以作为单独的项目运行,也可以在sln中添加csproj统一管理
=============================================================================================
文档注释.
/// <summary>
///
/// </summary>
在一个类,方法或属性定义的上一行输入///就会出现<summary>. 调用这个类或方法时写在<summary>里的东西就会以提示的方式出现。
=============================================================================================
屏幕显示
using System; //using 关键字用于在程序中包含 System 命名空间
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Project1 //命名空间,一个namespace是一系列的类
{
class Class1
{
static void Main(String[] args)
{
int a = 5;
int b = 2;
Console.WriteLine("a={0},b={1}",a,b); //屏幕上显示消息
Console.ReadKey(); //防止程序从 Visual Studio .NET 启动时屏幕会快速运行并关闭
}
}
}
=============================================================================================
5、C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如:
string str = @"C:\Windows"; <=====> string str = "C:\\Windows";
@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内
=============================================================================================
6、用户输入
using System;
namespace DeclaringConstants
{
class Program
{
static void Main(string[] args)
{
int num;
num = Convert.ToInt32(Console.ReadLine());//用户输入
Console.WriteLine("num={0}",num); //屏幕输出
Console.ReadKey(); //防止屏幕快速关闭
}
}
}
=============================================================================================
7、? 单问号用于对 int,double,bool 等无法直接赋值为 null 的数据类型进行 null 的赋值
int? ii; //默认值null
8、?? 如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值
=============================================================================================
9、析构函数
析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。
用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载
=============================================================================================
10、文件读写
using System;
using System.IO;
namespace Project1
{
class Program
{
static void Main(String[] args)
{
//写入文件
string[] s = new string[]{"the cake"," looks delicious"};
using(StreamWriter sw = new StreamWriter("d:/a.txt"))
{
foreach(string i in s )
{
sw.WriteLine(i);
}
}
//读取文件
string line;
using (StreamReader sr = new StreamReader("d:/a.txt"))
{
while((line=sr.ReadLine())!= null)
{
//显示在屏幕
Console.WriteLine(line);
}
}
Console.ReadKey();
}
}
}
=============================================================================================
11、System.Drawing画图
using System;
using System.Drawing;
namespace Project1
{
class Program
{
static void Main(string[] args)
{
//新建Bitmap对象
Bitmap b = new Bitmap(400, 400);
Graphics g = Graphics.FromImage(b);
g.FillRectangle(new SolidBrush(Color.Green),0,0,400,400);//颜色形状填充
g.DrawString("我的图片", new Font("arial", 20, FontStyle.Bold), new SolidBrush(Color.Black), 90, 20);//写文字
Pen pen = new Pen(Color.FromArgb(255, 255, 255), 1);
g.DrawEllipse(pen, 0,0,200, 100); //画椭圆
b.Save("d:/a.jpeg");//保存
}
}
}
=============================================================================================
Parse和Convert的区别:
(1)这两个方法的最大不同是对null值的处理方法:
Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常。
(2)对数据进行四舍五入时候的区别
a. Convert.ToInt32(double value)
如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5转换为4,4.5 转换为 4,而 5.5 转换为 6。 不过4.6可以转换为5,4.4转换为4
b. int.Parse("4.5")
直接报错:"输入字符串的格式不正确".
c. int(4.6) = 4
Int转化其他数值类型为Int时没有四舍五入,强制转换
(3)对被转换类型的区别
int.Parse是转换String为int
Convert.ToInt32是转换继承自Object的对象为int的(可以有很多其它类型的数据).
你得到一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32.
(4)Convert能转换的类型较多,Parse只能转换数字类型的字符串
=============================================================================================
类的封装:
public - 公共的,任何地方都可以访问,但是需要引用 命名空间
private - 私有的,类的内部才可以访问
internal - 内部的,默认的,程序集中可以访问,程序集就是命名空间
protected - 被保护的,类的内部和类的父类和子类中可以访问
=============================================================================================
数值类型与引用类型:
- 变量是值还是引用仅取决于其数据类型。
值类型: |
byte,short,int,long,float,double,decimal,char,bool ,enum,struct |
引用类型: |
string,class,数组,接口,委托 |
值类型-----变量声明后,不管是否已经赋值,编译器为其分配内存,在栈上分配。
引用类型------当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
=============================================================================================
重载与重写:
重载的条件:
1.必须在同一个类中2.方法名必须相同3.参数列表不能相同。不能只有返回类型不同
运算符重载:
public static Student operator +(Student stu1,Student stu2)
{
return new Student(stu1.Age + stu2.Age, stu1.Name + "+++" + stu2.Name);
}
重写的条件:
1. 在不同的类中
2. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致
3. 子类抛出的异常不能超过父类相应的方法抛出的异常
4. 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, private)
5.方法体不同
=============================================================================================
virtual 和 abstract的区别:
抽象方法是隐式的虚方法,virtual方法子类重写时用override
abstract 方法 | virtual方法 |
抽象方法不能实例化 | 必须有实现(只加一对{}也可以) |
子类必须实现该方法 | 子类可以重写,子类不重写,就使用父类定义的 |
一定在抽象类中 | 都可以 |
=============================================================================================
new的三种用法:
1)new 运算符:用于创建对象和调用构造函数。
Person p = new Person();
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。用new的方法相当于全新的一个方法,
class Program
{
static void Main(string[] args)
{
contact ct1 = new class1();
contact ct2 = new class2();
ct1.prinf();
ct2.prinf();
}
}
abstract public class contact
{
public virtual void prinf()
{
Console.WriteLine ("这是虚方法");
}
}
public class class1 : contact
{
public override void prinf()
{
Console.WriteLine ("这是新的方法");
}
}
public class class2 : contact
{
public new void prinf()
{
//只有 class2 c = new class2() 才会运行,contact cc = new class2() 会运行父类的方法
Console.WriteLine ("这是另一个新的方法");
}
}
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型
public class A<T> where :class,new()
{
public void Func()
{
T t=new T();
}
}
//对于多个类型参数,每个类型参数都使用一个 where 子句
class Dictionary<TKey, TVal>
where TKey : IComparable, IEnumerable,new()
where TVal : IMyInterface,new()
{
public void Add(TKey key, TVal val)
{
}
}
==============================================================================================
密封类和密封方法:
密封类:不希望被继承的类就可以设置为密封类
密封方法: 不是类的每个成员方法都可以作为密封方法,密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用,sealed修饰符位于override修饰符前面
==============================================================================================
Format:
转换为货币: string.Format("{0:C}", 735.444);
===============================================================================================
Invoke:
//改变控件状态时要这样写,直接改变可能会出错
private void button1_Click(object sender, EventArgs e)
{
this.Invoke(new EventHandler(delegate //调用方 位于创建控件所在的线程以外的线程中就要使用Invoke
{
button1.Text = "Invoke";
}));
}