zoukankan      html  css  js  c++  java
  • 重学c#系列——对c#粗浅的认识(一)

    前言

    什么是c#呢?

    首先你是如何读c#的呢?c sharp?或者c 井?

    官方读法是:see sharp。

    有没有发现开发多年,然后感觉名字不对。

    tip:为个人重新整理,如学习还是看官网,c# 文档天下无敌。

    正文

    c#和java一样,他们之间有很多故事,尤其是官司,c#同样是一门面向对象的语言,同样也支持面向组件编程。

    复制一下面向对象和面向组件编程的概念:

    面向对象技术的基础是封装--接口与实现分离,面向对象的核心是多态--这是接口和实现分离的更高级升华,使得在运行时可以动态根据条件来选择隐藏在接口后面的实现,面向对象的表现形式是类和继承。
    
    面向对象的主要目标是使系统对象化,良好的对象化的结果,就是系统的各部分更加清晰化,耦合度大大降低。
    
    面向组件技术建立在对象技术之上,它是对象技术的进一步发展,类这个概念仍然是组件技术中一个基础的概念,但是组件技术更核心的概念是接口。
    
    组件技术的主要目标是复用--粗粒度的复用,这不是类的复用,而是组件的复用,如一个dll、一个中间件,甚至一个框架。
    
    一个组件可以有一个类或多个类及其它元素(枚举、)组成,但是组件有个很明显的特征,就是它是一个独立的物理单元,经常以非源码的形式(如二进制,IL)存在。
    
    一个完整的组件中一般有一个主类,而其它的类和元素都是为了支持该主类的功能实现而存在的。
    
    为了支持这种物理独立性和粗粒度的复用,组件需要更高级的概念支撑,其中最基本的就是属性和事件,在对象的技术中曾一度困扰我们的类之间的相互依赖问题/消息传递问题,迄今为止我所知道最好的解决方案就是事件。
    
    要理解组件思想,首先要理解事件的思想和机制。
    

    c# 作为一门语言,那么内存管理的关键,c#有自动回收机制,为自动回收无法访问的对象,当然这针对于托管对象,非托管的还需自我管理。

    这里介绍一下非托管对象:

    非托管对象指.net不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件、窗口、网络连接、数据库连接、画刷、图标等。这类资源,垃圾回收器在清理的时候会调用Object.Finalize()方法。
    默认情况下,方法是空的,对于非托管对象在此方法中需要编写回收非托管对象的代码,以便垃圾回收器正确回收。(例如我们通常打开文件、图片等后需要进行Close()或者Dispose()去释放)。
    

    对于任何一门有垃圾自动回收装置,非托管资源基本差不多,因为作为托管程序不可能知道你想要啥时候断开网络连接、啥时候释放数据库连接,这些不用去记,如果是主观因素的基本都是非托管的。

    C# 采用统一的类型系统。官方这样解释道:

    所有 C# 类型(包括 int 和 double 等基元类型)均继承自一个根 object 类型。
    
    因此,所有类型共用一组通用运算,任何类型的值都可以一致地进行存储、传输和处理。 
    
    此外,C# 还支持用户定义的引用类型和值类型,从而支持对象动态分配以及轻量级结构的内嵌式存储。
    

    这个自定义引用类型好理解,这个自定义值类型是那些呢?

    自定义值类型就是struct和emun,也就是结构和枚举类型。

    但是这个轻量级结构的内嵌式存储是神马,我好像没有用过,只用过内嵌式数据库sqlite。

    案例

    hello word

    既然是重学,那么就从hello word开始吧。

    Console.WriteLine("Hello World!");
    

    然后输出:

    欢呼,记得在生涯中第一行是用c语言写的。

    声明和使用变量

    string aFriend = "Bill";
    Console.WriteLine(aFriend);
    

    c# 的官方开源命名是驼峰式的,所以我们一般命名也应该保存一直。

    方法名字首字母大写,而java则是方法也是驼峰式。

    类命名和java一样是首大写。

    使用字符串

    string firstFriend = "Maria";
    string secondFriend = "Sage";
    Console.WriteLine($"My friends are {firstFriend} and {secondFriend}");
    

    值得关注是内嵌字符串,内嵌字符串有很多门道的,比如说{}是一个int,那么就是会参数装箱和拆箱操作的,我们需要手动tostring。

    然后Console.WriteLine 实际上是自动调用了tostring方法,如果我们一个类没有重写tostring,那么将会调用object的tostring方法。

    字符串有一些自带的方法帮我们处理字符串。

    比如说:

    string greeting = "      Hello World!       ";
    Console.WriteLine($"[{greeting}]");
    string trimmedGreeting = greeting.TrimStart();
    Console.WriteLine($"[{trimmedGreeting}]");
    

    TrimStart帮助我们去除了前面的空格,但是在删除后和删除前是两个不同的字符串,所以我们在频繁操作字符串的时候需要使用StringBuilder,

    他会帮我们作为缓存,而不是直接去操作字符串。

    字符串对象同样帮助提供了搜索字符函数:
    如:

    string songLyrics = "You say goodbye, and I say hello";
    Console.WriteLine(songLyrics.StartsWith("you"));//false
    

    帮助查找是否是You开头的,StartsWith是区分大小写的。

    当然还有其他的函数如:contains,是否包含等,基本常规操作都有,不常规的就正则表达吧。

    总结

    上面只是粗浅的认识。但是可以看出c#一些关键的地方,垃圾回收、异常处理等一些细节之处。

    c# 感觉有一个最大的优点,就是版本控制比较好,不会出现python 这种2和3断层的存在,语法不会存在很大的差异,一般是引入语法糖和特性,不过c# 9.0的操作跨越时代,幅度有点大,史上最先进的语言,根据以往经验,基本上其他语言会抄一波的。

    疑惑

    存在的疑惑:

    c#的轻量级结构的内嵌式存储是什么呢?

  • 相关阅读:
    js相关小实例——大图轮播
    js相关小实例——div实现下拉菜单
    js相关小实例——二级菜单
    html5部分相关
    CSS3常用属性(边框、背景、文本效果、2D转换、3D转换、过渡、有过渡效果大图轮播、动画)
    数据访问
    php测试
    单例模式
    Doc
    横竖列表 下拉隐藏显示
  • 原文地址:https://www.cnblogs.com/aoximin/p/13272660.html
Copyright © 2011-2022 走看看