.NET精辟要点整理(补充中...)

资治通鉴:文言文、白话文对照读本 介绍一处可以免费下载资治通鉴的网址,该文献共20卷,排版为左边是文言文,右边是白话文翻译,对照阅读非常方便。下面是1-20卷的链接地址:第一卷:http://www.docin.com/p-9705067.html 第二卷:http://www.docin.com/p-9705979.html 第三卷:http://www.docin.com/p-9709382.html 第四卷: 阅读详情




Dispose()和Close()的区别

New和Override的区别

ref关键字

C#读写INI文件

接口

显式接口

抽象类

抽象类与接口的区别

静态变量

const 和 static readonly的区别

sealed关键字

索引指示器

类与结构的区别

using修饰符

构造函数

静态构造函数

string

string到底是值类型,还是引用类型?

展示一下具有值类型特征的操作

StringBuilder和String的区别

params

 

.NET精辟要点整理

和Close()的区别

要实现一个具有Dispose()功能的类,首先该类必须继承自一个具有Close()方法的类,并自己实现一个Dispose(bool)方法,此函数是Protected型的重载函数.

注意,其实Close()方法里面调用了IDisposable接口的Dispose()方法(此方法是显式实现的,请查阅如果显式实现接口方法),而Dispose()方法里面又调用了Dispose(bool)方法.所以,如果你要写一个带有释放资源功能的类,你只需实现Dispose(bool)方法即可.

提示:你最好在Dispose(bool)方法里,实现托管释放和非托管释放,按false/true区别,并且,为了保险起见,在Dispose(bool)方法中,也要释放父类的资源(因为子类要执行父类的构造函数,如果父类在它的构造函数里申请了资源,那当然要释放,如果没有的话,就可选了,但我觉得,最好释放一下,没坏处).

class MyClass : SysClass //实现一个自己类里的Close()方法

  {

     private IntPtr m_anotherMemory;

     private Bitmap m_anotherImage;

     private bool m_disposed = false;

     public MyClass()

      {

         m_anotherMemory = Marshal.AllocCoTaskMem(20);

         m_anotherImage = new Bitmap(25,25);

     }

     //实现Dispose(bool)

     //如果传入false,就只释放非托管资源;传入true,全部释放

     protected override void Dispose(bool isDisposing)

      {

         if(!m_disposed)

          {

             if(isDisposing)

              {

                 //在此处释放托管资源

                 m_anotherImage.Dispose();//m_anotherImage就是托管资源

             }

             //在此处释放非托管资源

             Marshal.FreeCoTaskMem(m_anotherMemory);

                 //子类会执行父类的构造函数,这里还需释放父类的

             base.Dispose(isDisposing);

             m_disposed = true;

         }

     }    

     ~MyClass()

      {

              //假如您有非托管资源,却忘记手动释放,不用担心,这里会执行释放

         Dispose(false);

     }

 }

public static void Main (string[] args)

  {

     SysClass sc = new MyClass();

     sc.Close(); //正确

     sc.Dispose(); //错误

     ((IDisposable)sc).Dispose(); //正确

 }

 

和Override的区别

override相当于C++中的重载,C++中的重载可以是同名且不同参(数目)的,而override则是样子一模一样的方法的重载,需要与virtual关键字配合使用;
new,
说实话,不写也无妨,只是编译器会报警告,而它通常出现在子类与父类同名的函数中.

 

关键字

       使参数按引用传递.若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字.

public class MyClass

{

    private int num = 256;

    public void Show()

    { Console.WriteLine(num); }

    public void Set(ref int num)

    { this.num = num; }

    public static void Main ()

    {

        MyClass m = new MyClass();

        int value = 1024;

        m.Set(ref value);

          //输出 1024

        m.Show();

    }

}

 

读写INI文件

//申明INI文件的写操作函数WritePrivateProfileString()

[DllImport("kernel32")]

 private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

//申明INI文件的读操作函数GetPrivateProfileString()

[DllImport("kernel32")]

 private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

private void readIni_Click(object sender, EventArgs e)

{

  StringBuilder strb = new StringBuilder(); 

  int get_val = GetPrivateProfileString("name", "sex", "", strb, 255, "test.ini");

  MessageBox.Show(strb.ToString());

}  

 

不能有static成员、默认public但不写、子类方法若与父类同须用new、实现父类全部方法.

显式说明的接口成员最优先实现; 

如果两个或多个父接口中存在同名成员,就产生二义性.此时,最好使用显式声明.

public class MyClass

    {

        public interface Animal

        { void Walk(); }

        public interface Person : Animal

        { void Walk(); }

        public class Man : Person

        {

                //父接口和爷爷接口有两个同样的方法,需显式实现,不然不知道哪个对哪个

                //显式实现接口方法是public的,但不需要加public,但它是public的.非显式的可要加上public哦!

            void Person.Walk()

            { Console.WriteLine("Person is walking..."); }

            void Animal.Walk()

            { Console.WriteLine("Animal is walking..."); }

        }

        public static void Main ()

        {

            Man m = new Man();

            Person p = (Person)m;

                //显式接口的访问:必须通过接口的对象访问

            p.Walk();

            Animal a = (Animal)m;

            a.Walk();

        }

}

Output:

Person is walking...

Animal is walking...

 

       abstract修饰符可以用于类、方法、属性、事件和索引指示器.抽象类不能被实例化;不能用sealed修饰符让它无法被继承;非抽象子类必须实现所有抽象父类的方法;抽象类中的方法是隐式的Virtual方法.

    public class MyClass

    {

        public abstract class AMedia

        {

            public abstract void Play();

                  //抽象类里可以实现方法(千万不要在该方法前面加上abstract)

            public void Close()

            { Console.WriteLine("have closed..."); }

        }

        public class Audio : AMedia

        {

                  //记得override

            public override void Play()

            { Console.WriteLine("is plaing..."); }

        }

        public static void Main ()

        {

            Audio a = new Audio();

            a.Play();

            a.Close();

        }

    }

 

抽象类 是从一系列对象中抽象出来的概念,因此反映事物的内部共性;

接口   是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性.

不同点:抽象类可以包含实现的类,而接口只能包含定义;抽象类的抽象方法默认隐式Virtual,而接口类方法默认public;抽象类不能被实例化,接口却可以;

相同点:都能被继承;都需要实现父类的所有方法;

分析对象,提炼内部共性形成抽象类,用以表示对象本质,取”是什么”;

为外部提供调用或功能需要扩充时优先使用接口.

 

需使用类名访问

    public class MyClass

    {

        static int staNum = 100;

        public static void Main ()

        { MyClass.staNum = 10000; }

}

 

和 static readonly的区别

1.        const 是在编译期间初始化;

2.        static readonly 是在运行期间初始化.

调用方法: 都需要使用类名访问!

 

关键字

1.        修饰类时,该类不能被继承;

2.        修饰方法和属性时,该方法和属性也不能被继承.(修饰方法时,sealed总是和override连用,由此说明该方法肯定是virtaul的)

        sealed类可以有虚函数吗? 可以,但基类中的虚函数隐式转换成非虚函数.

class Base

{

    public virtual void Show()

    { Console.WriteLine("I am Base..."); }

}

sealed class Son : Base

{

    // Base中的虚函数Show()已隐式转换为非虚函数了.

    //Son类不能自己再定义虚函数!

}

 

 

         像数组一样,唯一不同的是,[]中不局限于int型.

        public int this[int Index]

        {

            get { }

            set { }

        }

 

不同点:    类是引用类型(在堆上,手动释放),结构是值类型(在栈上,自动释放)

相同点:    结构也有构造函数,但前提是一个带参数的构造函数;

效率: 类实例的赋值只是复制了引用;而结构的赋值却是产生一个新的对象.

 

修饰符

       引用空间名,为空间名起别名;

释放资源.

 

不能有参数,且只能操作静态成员;

public class Static

{

    static int i = 100;

    static Static()

    {

        Static.i = 999;

    }

}

若父类没有定义无参数的构造函数,在定义子类构造函数时,需显式初始化父类的构造函数

public class Dad

{

    private int dadAge;

    public Dad(int age)

    { dadAge = age; }

}

public class Son : Dad

{

    private int sonAge;

    public Son(int age)

        : base(0) //显式初始化父类的构造函数

    { sonAge = age; }

}

 

总结:

到底是值类型,还是引用类型?

答:我可以很肯定的告诉你,是引用类型,只不过它在某些操作上会表现出值类型的特征.如函数参数,==时.

string的一个特殊性就在于它”不会变”.

何为”不会变”,展示一下:

    public class MyClass

    {

        public static void Main ()

        {

            string str1 = "I am a number";

            string str2 = str1;

            Console.WriteLine("str1 = " + str1);

            Console.WriteLine("str2 = " + str2);

            str1 = "I am another number";

            Console.WriteLine("after str1 changed... str1 = " + str1);

            Console.WriteLine("after str1 changed... str2 = " + str2);

        }

}

Output:

str1 = I am a number

str2 = I am a number

after str1 changed...str1 = I am another number

after str1 changed...str2 = I am a number

public static void Main ()

{

    string str = "china";

    Change(str);

    Show(str);

}

//这里的参数传递,实质上是 = 过程,和上例一样,会产生一个新的引用

public static void Change(string str)

{ str = "china yangzhou "; }

public static void Show(string str)

{ Console.WriteLine(str); }

Output:

china

 

和String的区别

       String虽然是引用类型,但在赋值时却会产生新的对象;

StringBuilder则不会,所以在处理大量字符串时,它是首选.

 

该关键字用在方法的参数列表中,为该方法参数提供了可变的能力.它只能出现一次,且只能定义在所有参数最后.

//params 定义的参数后面不可以再定义其它参数

public static void UseParams(string str, params object[] list)

{

    Console.WriteLine(str);

    for (int i = 0; i < list.Length; i++)

    { Console.WriteLine(list[i]); }

}

static void Main (string[] args)

{

    String[] str = new string[] { "I", "LOVE", "YOU" };

    Program.UseParams("Hello", str);

}

使用单片机开发PWM的案例&相关项目源码 该项目使用STM32单片机生成PWM信号,通过改变PWM的占空比来控制连接在PWM输出引脚(如PA0)上的LED的亮度。在主循环中,通过改变比较值,PWM信号的占空比在0%到100%之间变化,从而实现LED亮度的渐变效果。这个项目是一个基础的PWM控制示例,通过学习和实践这个项目,可以掌握PWM的基本原理和使用方法,并为进一步开发和应用打下良好的基础。该项目实现了使用STM32单片机产生PWM信号,并通过改变PWM的占空比来控制LED的亮度。配置PWM输出引脚(如PA0),确保其模式为PWM输出。 阅读详情

相关推荐

SAP MIGO屏幕增强的具体实施步骤介绍(SE19:MB_MIGO_BADI) <转载>

1.MIGO抬头屏幕增强具体增强实施步骤1.1.创建存储抬头客制化数据的增强表1.2.创建增强结构1.3.创建函数组ZMM_MIGO1.3.1.定义全局变量1.3.2.创建数据处理函数1.4.创建字屏幕9001屏幕PBOendif.endloop.1.5.实施新BADI增强SE19创建BADI实施双击实施类ZCL_MIGO_EN_01exportingendif.endmethod.endif.endif.exportingendmethod.

qq_55488207的博客 4507

java、jvm与.net

 现在sun已经被oracle收购了!也从侧面验证了作者的一些论断!当然从技术上看,这篇文章也是分析很精辟。反正我自己感觉c很好用,java以及所谓的OO更多是一些概念。Java在自取灭亡      一个比较Java语言发展的讨论贴,非常精辟深刻,从语言的设计到系统架构的策略。Java是开源了,但是它的发展策略似乎是一

oohurbert的专栏 3868

如何将一个向量投影到一个平面上_线性代数19——投影矩阵和最小二乘

一维空间的投影矩阵  先来看一维空间内向量的投影:  向量p是b在a上的投影,也称为b在a上的分量,可以用b乘以a方向的单位向量来计算,现在,我们打算尝试用更“贴近”线性代数的方式表达。  因为p趴在a上,所以p实际上是a的一个子空间,可以将它看作a放缩x倍,因此向量p可以用p = xa来表示,只要找出x就可以了。因为a⊥e,所以二者的点积为0:  我们希望化简这个式子从而得出x:  x是一个实数...

weixin_39741101的博客 5229

转:asp.net——知识整理(1)asp.net常规页生命周期阶段列表和事件列表

asp.net常规页生命周期阶段列表和事件列表 当我们使用asp.net开发网站,每运行一个页面,这个页面都将经历一个生命周期。了解页 的生命周期非常重要,因为这样我们才能在合适的生命周期编写代码实现预期效果。网上有一句话概括非常精辟:"Do the right thing at the right time in the right place."。微软的文档给出的ASP.NET生...

weixin_30919235的博客 191

从HSPICE到Spectre:手把手教你搞定不同SPICE仿真器的网表转换(附避坑指南)

本文详细介绍了从HSPICE到Spectre的SPICE仿真器网表转换方法,包括核心语法差异、分步转换流程和常见问题排查。通过实战案例和避坑指南,帮助工程师高效解决不同SPICE仿真器间的兼容性问题,提升集成电路设计效率。

weixin_29745609的博客 366

ROS Navigation global_planner框架解析

ROS Navigation global_planner框架解析主要讲一下我看源码总结的框架,如果大家跟着这个框架看源码的话可能会看的比较快。主要讲解global_planner关键配置参数含义及关键函数Astar,Dijkstra,QuadraticCalculator::calculatePotential,PotentialCalculator::calculatePotential,GridPath::getPath,GradientPath::getPath.

Jeff_Lee_的博客 4693

你了解Dot Net 分层架构吗?

为什么80%的码农都做不了架构师?>>> ...

weixin_34277853的博客 193

光模块基础知识【快速入门】02

光模块是用于交换机与设备之间传输的载体,是光纤通信系统中的核心器件。主要作用是发射端将设备的电信号转换成光信号。 光纤通道光模块和以太网光模块 光纤通道光模块 光纤通道(FC, Fiber Channel)是一种高速网络数据传输协议。光纤通道协议可以有序无损地传输原始数据,它主要用于在数据中心、电脑服务器、交换机与存储网络中进行数据传输。 FC光模块遵循FC协议,充当着光纤通道系统之间的接口,也是光纤存储网络设备间的接口。它们主要用于数据中心的光纤通道存储网络链接中。 FC光模块具有小型化和低.

Jin Hanquan的博客 3万+

写在大年初一:静悄悄的启航

今天是2007年02月18日,农历猪年大年初一。 打开音箱,播一首理查德·克莱德曼的《午后的旅行》,慢慢地开始这篇文章……按照我的性格,决定了一件事情要去做,那么就会默默整理好行装、背起行囊安静地启航。又是一年过去了,在这一年中,我经历了激情、活跃、挫折、振作……性格就是这么慢慢磨出来了。在这一年中,值得感谢的人也太多了,多得就像天上的星星。...

weixin_33713707的博客 127

Emuelec系统安装全流程:超详细版指南(从零开始)

手把手带你完成emuelec系统的完整安装,从基础准备到系统配置一步不落,适合新手入门。深入解析emuelec在各类设备上的部署技巧,让复古游戏体验更流畅。

weixin_42594419的博客 1967

《二、企业级监控系统之Prometheus监控node_exporter》

文章目录一、部署node_exporter服务二、部署prometheus服务2.1、部署node_exporter服务三、grafana之添加数据源四、grafana之导入监控模板五、grafana之修改模板变量六、grafana之修改仪表板变量总结 > 这里是引用 一、部署node_exporter服务 docker run -d --restart=always --name node_exporter --net=“host” --pid=“host” -v “/:/host:ro,

东城绝神 1万+

三层架构与养猪—《.NET深入体验与实战精要》

一个理解三层架构的精辟比喻,希望大家看过之后能很好的理解三层架构~ 为了更好地让初学者轻松入门,这里仍然采用趣味性的方式聊一些常用技术点,致力于.NET新手们的快速提高!知识都是普通的,关键是学习的思路。技术源于生活,技术原来可以这样学。抛砖引玉而已。 层次结构在现实社会里随处可见。记得有个笑话讲有个村长得意地向他老婆吹牛:“全中国只有四个人比我官大,乡长、县长、省长和国务院总理...

weixin_33937778的博客 85

OBC_开环扫频波特图拟合操作流程(结合 Simulink)

摘要: 本文详细介绍了基于Simulink的开环扫频波特图测试与拟合流程,适用于电源/控制系统(如LLC/PFC)的小信号分析。主要内容包括:1)前期准备(测试点选择、信号范围设定);2)Simulink建模方法(信号注入、数据记录);3)两种扫频方式(逐频正弦/Chirp扫频)的实现;4)MATLAB数据处理(FFT分析、传递函数拟合);5)线性分析工具使用技巧。重点强调了激励信号幅值控制、稳态数据采集及模型验证方法,并提供完整MATLAB脚本示例。该流程可有效获取系统频域特性,为控制器设计提供可靠依据。

Sumerking的博客 232

InfoQ中文站每周精要第11期

<!--a { color: black; text-decoration: none;}a:hover { color: #0b59b2; text-decoration: underline;}--> InfoQ中文站 每周精要 广告 MIX07会议视频下载 在MIX07大会上,Silverlight揭

编辑空间 1838

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【愚公系列】《扣子开发 AI Agent 智能体应用》019-扣子数据库实战(扣子数据库概述)

💎 摘要: 扣子(Coze)平台的数据库功能为智能体开发提供结构化数据存储与管理能力,支持单用户(强隔离)和多用户(共享协作)两种模式,满足不同场景需求。 🔹 核心对比 单用户模式:数据按渠道隔离(如个人保险箱),用户仅操作自身数据。 多用户模式:数据池共享(如公共文件夹),权限由业务逻辑控制。 🔹 操作方式 支持自然语言或SQL增删改查,提供四大图形化节点(新增/查询/更新/删除)及自定义SQL节点。 🔹 与知识库差异 数据库:管理动态结构化数据(如用户订单)。 知识库:存储静态文本知识(如产品手

愚公智库 7万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[述评] 也说《代码大全2》

  通读《代码大全2》已经是几个月前的事情了。  我的工作中有一项是给各种各样的程序员或准程序员培训.NET开发技术,其中又以C#语言课程为基本。今天恰好是一个为期3周的C#课程的尾声。在这一期课程里,我打破了所有过去积累下来的培训经验,而是从课程第一天,就开始向学生灌输设计、架构、思想方面的内容——虽然他们大多数是没有基础的人。每讲到一个语法(或类型或技巧),就把相关的思维方式介绍出来,告诉

Anders Liu (lover_P)的.NET天空 2532

学习VC的经典书籍

      都说真正的程序员是学习VC的,我不敢如此奢望,只是对于编程有点儿兴趣,希望这么个兴趣可以充实下自己。零零星星的学习了点VC,但现在才知道我完全没有入门,没有人指点,一个人在瞎摸索着,耽误了不少宝贵的时间,痛定思痛,决定从头再来,磨刀不误砍柴工,打下扎实的基础是日后成为一名合格程序员必经之路,我以前错过了,只能现在费时间再补,如果可以让我再来,我学习VC会从windows开始而不是C++。      下面是根据网上牛人整理出来的成为VC达人必须学习的书籍(借鉴了http://blog.csdn.n

skycity0713的专栏 7102

svn服务器 无线访问权限,SVN 服务器端权限管理

创建用户点击菜单上的Users可以在右侧窗口区域中看见已经创建的用户创建组同样也可以修改组:分配权限示例一:开发人员拥有读写权限(组权限)进入权限分配界面:添加组或用户:在添加页面可以添加用户、组、等将组添加进来后,就可以进行权限分配了权限等级为:继承父目录权限 、 不可访问 、 读权限 、读/写权限这里我选 择 读/写权限设置后我们再用TortoiseSVN客户端访问svn服务器就需要密码了登陆...

weixin_34513260的博客 1736

学习vc过程的经典书籍

      都说真正的程序员是学习vc的,我不敢如此奢望,只是对于编程有点儿兴趣,希望这么个兴趣可以充实下自己。零零星星的学习了点vc,但现在才知道我完全没有入门,没有人指点,一个人在瞎摸索着,耽误了不少宝贵的时间,痛定思痛,决定从头再来,磨刀不误砍柴工,打下扎实的基础是日后成为一名合格程序员必经之路,我以前错过了,只能现在费时间再补,如果可以让我再来,我学习vc会从windows开始而不是C++

沙漠天空 2341

管理软件设计思路演化(新)

中国软件行业发展了这么多年,管理类软件的设计主线上大致经历了三大阶段。第一代“管钱、物”为主:大家都知道,中国第一代管理类软件主要是以“管钱、物”为主的各类财务、仓库管理等软件系统,这些系统几乎已经在所有企业里得到了成熟应用,并都得到长足发展和完善;此类软件主要是依据稳定财务制度的相关规定和相关表单及成熟规范的报表、统计需求来设计的。功能是标准化的功能,为管理人员提供提升效率的利器。在这个

E8.Net 4654

商城系统下单库存管控系列杂记(二)(并发安全和性能部分延伸)

前言   参与过几个中小型商城系统的开发,随着时间的增长,以及对系统的深入研究和测试,发现确实有很多值得推敲和商榷的地方(总有很多重要细节存在缺陷)。基于商城系统,无论规模大小,或者本身是否分布架构,个人觉得最核心的一环就是下单模块,而这里面更相关和棘手的一些设计和问题,大多时候都涉及库存系统。想想之前跟某人的交流,他精辟点评“库存管控做得好,系统设计就成功了一半”,自己颇有认同。围绕这个点,...

weixin_36794678的博客 679

Python深度学习:从入门到实战

亲爱的读者,欢迎您翻开这本书。我们即将探索的,是深度学习的宇宙——一个由数据、算法与算力构筑的奇妙世界。它既是严谨的科学,也是创造的艺术,更是一条通往未来智慧的修行之路。本书将带您从最基础的数学原理出发,亲手搭建神经网络,驾驭Transformer等前沿模型,最终将智慧转化为现实世界的价值。请放下畏惧,保持好奇。这不仅是一次知识的学习,更是一场思维的远行。来,随我一起,开启这趟非凡的旅程吧。

weixin_45747731的博客 296
上一篇: C#-操作XML笔记(补充中...)
下一篇: ASP2.0-跨页面传值技巧总结
MasterFT
博客等级 码龄20年 48粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值