c#基础

这篇博客详细介绍了C#的基础知识,包括解决方案(.sln和.csproj)的含义、文档注释的使用、屏幕显示、用户输入、析构函数、文件读写、System.Drawing画图、Parse和Convert的区别、类的封装、数值类型与引用类型、重载与重写、virtual与abstract的区别、new的三种用法、密封类和密封方法,以及Format和Invoke的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.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";
            }));

        }

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值