C#基础知识

/*
*文章未优化完成,我会尽快维护
*/
目錄
一、类库:图书馆,命名空间:书架,类:书籍,方法:目录
1、类库的引用:
2、初识类与名称空间:
3、依赖关系:
4、类与对象的关系:
5、类的三大成员:
6、静态成员与实例成员:
二、C#语言的基本元素、类型、变量、方法、算法:
1、构成C#语言的基本元素:
2、简要介绍类型、变量和方法:
3、算法简介:
三、类型
1、什么是类型(Type)
2、类型在C#语言中的作用
3、C#语言的类型系统
四、变量、对象与内存
1、什么是变量:
2、值类型的变量
3、引用类型的变量和实例
4、局部变量是在stack(栈)上分配内存
5、变量的默认值
6、常量(值不可改变的变量)
7、装箱与拆箱(Boxing & Unboxing)
五、方法的定义、调用与调试:
1、方法的由来:
2、方法的定义与调用:
3、构造器(一种特殊的方法):
4、方法的重载:
5、如何对方法进行Debug
6、方法的调用与栈(*难点)
六、操作符
1、操作符概述
2、操作符的本质
3、操作符的优先级
4、同级操作符的运算顺序
5、基本操作符
6.一元操作符
七、表达式和语句
1、表达式的定义
2、各式表达式概览
3、语句的定义
4、语句详解
八、字段、属性、索引器、常量
1、字段
2、属性:
3、索引器
4、常量
九、传值/输出/引用/数组/具名/可选参数,扩展方法
1、传值参数
2、输出参数
3、引用参数
4、数组参数
5、具名参数
6、可选参数
7、扩展方法(this参数)
十、委托
1、什么是委托
2、委托的声明(自定义委托)
3、委托的使用
十一、事件
1、初步了解事件
2、事件的应用
3、深入理解事件
4、事件的声明
5、问题辨析

一、类库:图书馆,命名空间:书架,类:书籍,方法:目录

1、类库的引用:
(1) 类库引用是使用名称空间的物理基础
不同技术类型的项目会默认引用不同类型的类库。
(2) DLL引用(黑盒引用,无源代码)
NuGet简介(DLL服务器)
(3) 项目引用(白盒引用,有源代码)

2、初识类与名称空间:
(1) 类(class)是构成程序的主体【初学者需要知道的定义】。
(2) 类(class)是最基础的C#类型。类是一个数据结构,将状态(字段)和操作(方法和其他函数成员)组合在一个单元中。类为动态创建的类实例(instance)提供了定义,实例也称为对象(object)。类支持继承(inheritance)和多态性(polymorphism),这是派生类(derived class)可用来扩展和专用化基类(base class)的机制【C#语言文档的定义】。
(3) 类(class)是现实世界事物的模型;
类是对现实世界事物进行抽象所得到的结果;
[1]事物包括“物质”(实体)与“运动”(逻辑);
[2]建模是一个去伪存真、由表及里的过程(将程序中用到的东西留下;“表” 就是看得到的接口,“里”就是看不到的封装的逻辑。)。
名称空间(namespace):以树型结构组织类(和其他类型),例如:Button和Path类。
命名空间保证同名的类不冲突。

3、依赖关系:
(1) 类(或对象)之间的耦合关系;
(2) 优秀的程序追求“高内聚,低耦合”;
高内聚:将类放到该放的类库中;
低耦合:类与类之间的关系尽量低依赖;
教学程序往往会违反这个原则;
(3) UML(通用建模语言)类图;
【*依赖关系是软件质量的关键。】

4、类与对象的关系:
(1) 对象也叫实例,是类经过“实例化”后得到的内存中的实体;
Formally “instanc” is synonymous with “object”——对象和实例是一回事;
“飞机”与“一架飞机”有何区别?天上有(一架)飞机——必须是实例飞,概念是不能飞的;
有些类是不能实例化的,比如“数学”(Math Class),我们不能说“一个数学”。
(2) 依照类,我们可以创建对象,这就是“实例化”;
现实世界中常称“对象”,程序世界中常称“实例”,二者并无太大区别,常常混用。
(3) 实例化:使用new操作符创建类的实例,后面加上()构造器。
(4) 引用变量与实例的关系;
孩子与气球;
气球不一定有孩子牵着;
多个孩子可以使用各自的绳子牵着一个气球,也可以都通过一个绳子牵着气球。

namespace ClassAndInstance
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Form myForm;    //创建引用变量
            myForm = new Form();    //将new出来的实例Form,赋值给引用变量myForm
            myForm.Text = "MyForm"; //给Form的标题命名为MyForm
            myForm.ShowDialog();    //显示输出窗口
        }
    }
}

5、类的三大成员:
(1) 属性(Property)
存储数据,组合起来表示类或对象当前的状态
(2) 方法(Method)
由C语言中的函数(function)进化而来,表示类或对象“能做什么”
工作中90%的时间是在与方法打交道,因为它是“真正做事”、“构成逻辑”的成员

namespace EventSample
{
   
    public partial class MainWindow : Window
    {
   
        public MainWindow()
        {
   
            InitializeComponent();
            //*实例化
            DispatcherTimer timer = new DispatcherTimer();
            //*给属性值
            //间隔多长时间触发一次Tick(这里是一秒钟)
            timer.Interval = TimeSpan.FromSeconds(1); 
            //*挂接事件处理器
            //事件“Tick”通过“+=”将函数“timer_Tick”挂接,这个事件触发时,下面的函数就会执行。
            //所以这个方法叫做事件处理器。
            timer.Tick += timer_Tick;       
            //*方法调用
            //让时钟开始
            timer.Start();
        }

        void timer_Tick(object sender, EventArgs e)
        {
   	
            //事件触发时,执行下面方法
            //访问当前时间(时钟)
            this.timeTextBox.Text = DateTime.Now.ToString();
        }
    }
}

(3) 事件(Event)
类或对象通知其它类或对象的机制,为C#所特有(Java通过其他办法实现这个机制)
善用事件机制非常重要
(4) 使用MSDN文档
(5) 某些特殊类或对象在成员方面侧重点不同
模型类或对象重在属性,如:Entity Framework
工具类或对象重在方法,如:Math,Console
通知类或对象重在事件,如各种Timer

6、静态成员与实例成员:
(1) 静态(Static)成员在语义上表示它是“类的成员”
(2) 实例(非静态)成员在语义表示它是“对象的成员”

namespace StaticSample
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Console.WriteLine("Hello!");    //*静态:WriteLine隶属于Console,由Console直接调用

            Form form = new Form();     //*实例:实例化,定义变量form
            form.Text = "Hello!";       //通过变量form来调用实例的方法“Text”
            form.ShowDialog();
        }
    }
}	

(3) 绑定(Binding)指的是编译器如何把一个成员与类或对象关联起来
不可小觑的“.”操作符——成员访问
(类.类成员,实例.实例成员)

二、C#语言的基本元素、类型、变量、方法、算法:
1、构成C#语言的基本元素:
(1)关键字(Keyword)
MSDN文档:Visual C#->C#Reference(所有关键字)
(2)操作符(Operator)
Visual C#->C#Reference->C#Operators(所有运算符)
(3)标识符(Identifier)
合法的标识符(阅读语言定义文档)
大小写规范(变量名用驼峰命名法,类、方法用Pascal命名法[所有单词首字母大写])
命名规范
int inForm = 100; //驼峰命名法
Console.WriteLine(inForm); //Pascal命名法
(4)标点符号
(5)文本(字面值)
整数(多种后缀)
int z = 10;
long h = 10L;
实数(多种后缀)
float X = 10.0F;
double Y = 20.0D;
字符
char c = ‘a’;
字符串
string str = “abcde”;
布尔
bool b = true;
bool b2 = false;
空(NULL)
(6)注释与空白
单行
多行(块注释)

2、简要介绍类型、变量和方法:
(1)初识类型(Type)
亦称数据类型(Data Type)
var v = 3L;
Console.WriteLine(v.GetType().Name); //INT64
(2)变量是存放数据的地方,简称“数据”
变量的声明
变量的使用
(3)方法(旧称函数)是处理数据的逻辑,又称“算法”
方法的声明
方法的调用

namespace Identifiers
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Calculator c = new Calculator();
            int x = c.Add(2,3);
            Console.WriteLine(x);

            Calculator d = new Calculator();
            string str = d.Today();
            Console.WriteLine(str);

            Calculator a = new Calculator();
            a.PrintSum(4,5);
        }
    }

    class Calculator
    {
   
        public int Add(int a, int b)
        {
   
            int result = a + b;
            return result;
        }

        public string Today()
        {
   
            int day = DateTime.Now.Day;
            return day.ToString();
        }

        public void PrintSum(int a, int b)
        {
   
            int result = a + b;
            Console.WriteLine(result);
        }
    }
}

(4)程序=数据+算法
3、算法简介:
(1)循环体验
(2)判断体验

namespace Identifiers
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Calculator x = new Calculator();
            x.PrintXTo1(10);
        }
    }

    class Calculator
    {
   
        //public void PrintXTo1(int x)  //循环输出
        //{
   
        //    for (int i = x; i > 0; i--)
        //    {
   
        //        Console.WriteLine(i);
        //    }
        //}

        public void PrintXTo1(int x)    //判断输出(自己调用自己)
        {
   
            if (x == 1)
            {
   
                Console.WriteLine(x);
            }
            else
            {
   
                Console.WriteLine(x);
                PrintXTo1(x-1);
            }
        }
    }
}

(3)1~100相加

namespace Identifiers
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Calculator x = new Calculator();
            int result = x.SumFrom1ToX(100);
            Console.WriteLine(result);
        }
    }

    class Calculator
    {
   
        //public int SumFrom1ToX(int x)     //循环
        //{
   
        //    int result = 0;
        //    for (int i = 1; i < x + 1; i++)
        //    {
   
        //        result = result + i;
        //    }
        //    return result;
        //}

        //public int SumFrom1ToX(int x)   //递归
        //{
   
        //    if (x==1)
        //    {
   
        //        return 1;
        //    }
        //    else
        //    {
   
        //        int result = x + SumFrom1ToX(x-1);
        //        return result;
        //    }
        //}

        public int SumFrom1ToX(int x)
        {
   
            return (1 + x) * x / 2;
        }
    }
}

【*注:ctrl+k+c:所选部分注释; ctrl+k+u:所选部分解除注释。】

三、类型
1、什么是类型(Type)
(1)又名数据类型(Data Type)
A data type is a homogeneous collection of values,effectively presented,equipped presented,equipped with a set of operations which manipulate these values.
是数据在内存中存储时的“型号”。
小内存容纳大尺寸数据会丢失精准度、发生错误。
大内存容纳小尺寸数据会造成浪费。
编程语言的数据类型与数据的数据类型不完全相同。

namespace StrongTyped
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            int x;      //int:32个bit,4字节
            x = 100;
            long y;     //long:64个bit位,8个字节
            y = 100L;
            x = 100L;   //int型的x,放不了100L

            bool b;
            b = 100;    //识别不了数值

            if( x = 200 )   //因为x被赋值200,不是布尔值,就输出不了
            {
   
                Console.WriteLine("It's OK!");
            }
        }
    }
}
(2)强类型语言与弱类型语言的比较
	强类型语言:受数据类型影响较大,弱类型语言则相反。
	C语言示例:if条件。
	JavaScript示例:动态类型。
	C#语言对弱类型/动态类型的模仿。
int _tmain(int argc, _TCHAR* argv[])
{
   
	int x = 100;
	if( x = 200 )	//在if语句中被重新赋值为200,会输出结果。因此常被写作 200==x
	{
   
		printf("It's OK!\n");
	}

	return 0;
}

2、类型在C#语言中的作用
(1)一个C#类型中所包含的信息有:
[1]存储此类型变量所需的内存空间大小。
[2]此类型的值可表示的最大最小值范围。
[3]此类型所包含的成员(如方法、属性、事件等)。
[4]此类型由何基类派生而来。

namespace TypeSample
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            Type myType = typeof(Form);

            PropertyInfo[] pInfo = myType.GetProperties();  //PropertyInfo:属性的信息
            MethodInfo[] mInfo = myType.GetMethods();   //MethodInfo:方法的信息
            //foreach(var p in pInfo)
            //{
   
            //    Console.WriteLine(p.Name);
            //}
            foreach(var m in mInfo)
            {
   
                Console.WriteLine(m.Name);
            }

            Console.WriteLine(myType.Name);
            Console.WriteLine(myType.FullName);
            Console.WriteLine(myType.BaseType);
            Console.WriteLine(myType.BaseType.BaseType.FullName);
        }
    }
}

[5]程序运行的时候,此类型的变量在分配在内存的什么位置:
Stack简介(栈),
Stack overflow,
Heap简介(堆),
使用Performance Monitor查看进程的堆内存使用量,
关于内存泄漏;

/*栈*/
namespace StackOverflow
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            BadGuy bg = new BadGuy();   //先创建实例
            bg.BadMethod();             //调用方法
        }
    }

    class BadGuy
    {
   
        public void BadMethod()
        {
   
            int x = 100;
            this.BadMethod();   //递归:不断的调用自己,最后栈会爆掉
        }
    }
}

namespace StackOverflow
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            unsafe
            {
   
                int* p = stackalloc int[9999999];   //在栈上面切内存,只要足够大就会爆掉
            }
        }
    }
}

/*堆*/
namespace HeapSample
{
   
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
   
        public MainWindow()
        {
   
            InitializeComponent();
        }

        List<Window> winList;       //变量,声明在函数之外,Window占用内存高

        private void Button1_Click(object sender, RoutedEventArgs e)
        {
   
            winList = new List<Window>();   //创建List实例,可以装Window
            for (int i = 0; i < 15000; i++ )
            {
   
                Window w = new Window();    //引用变量w,牵着Windows()实例
                winList.Add(w);     //加入队列
            }
        }

        private void Button2_Click(object sender, RoutedEventArgs e)
        {
   
            winList.Clear();    //清除内存
        }
    }
}

[6]此类型所允许的操作(运算)。

namespace 
  • 12
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值