测试一下~~

http://blog.csdn.net/lindexi_gd/article/details/79617425

本文来告诉大家在C#很少有人会发现的科技。即使是工作了好多年的老司机也不一定会知道,如果觉得我在骗你,那么请看看下面


因为C#在微软的帮助,已经从原来很简单的,到现在的很好用。在10多年,很少人知道微软做了哪些,我在网上找了很多大神的博客,然后和很多大神聊天,知道了一些科技,所以就在这里说。如果大家看到这个博客里面没有的科技,请告诉我。

无限级判断空

在 C# 6.0 可以使用??判断空,那么就可以使用下面代码

            var v1 = "123";
            string v2 = null;
            string v3 = null;

            var v = v1 ?? v2 ?? v3;

实际上可以无限的使用??

using 省略长的定义

例如有这个代码,使用了很多的 List ,里面有很多定义

var foo =
                new System.Collections.Generic.Dictionary<
                    System.Collections.Generic.List<System.Collections.Generic.List<string>>, string>();

可以看到需要写很多代码,如果这个值作为参数,才是可怕。

一个简单的方法是使用

using HvcnrclHnlfk=System.Collections.Generic.Dictionary<System.Collections.Generic.List<System.Collections.Generic.List<string>>,string>;

,这个文件里的所有定义都可以使用 using 后面的值可以代替。

var foo = new HvcnrclHnlfk();

辣么大

实际上我有些不好意思,好像刚刚说的都是大家都知道的,那么我就要开始写大家很少知道

          Func<string,string, EventHandler> foo = (x, y) => (s, e) =>
            {
                var button = (Button) s;
                button.Left = x;
                button.Top = y;
            };

            Button1.Click += foo(0, -1);

看一下就知道这个定义可以做什么

冲突的类型

如果遇到两个命名空间相同的类型,很多时候都是把命名空间全写

var webControl = new System.Web.UI.WebControls.Control();
var formControl = new System.Windows.Forms.Control();

如果经常使用这两个控件,那么就需要写空间,代码很多,但是微软给了一个坑,使用这个可以不用写空间

using web = System.Web.UI.WebControls;
using win = System.Windows.Forms;

web::Control webControl = new web::Control();
win::Control formControl = new win::Control();

参见:https://stackoverflow.com/a/9099/6116637

extern alias

如果使用了两个 dll ,都有相同命名空间和类型,那么如何使用指定的库

//a.dll

namespace F
{
    public class Foo
    {

    }
}

//b.dll

namespace F
{
    public class Foo
    {

    }
}

这时就可以使用 extern alias

参见:C#用extern alias解决两个assembly中相同的类型全名 - fresky - 博客园

字符串

大家看到了 C# 6.0 的$,是不是可以和@一起?

            var str = "kktpqfThiq";
            string foo = $@"换行
{str}";

注意两个的顺序,反过来直接告诉你代码不能这样写

表达式树获取函数命名

定义一个类,下面通过表达式树从类获得函数命名

    class Foo
    {
        public void KzcSevfio()
        {
        }
    }
       static void Main(string[] args)
        {
            GetMethodName<Foo>(foo => foo.KzcSevfio());
        }

        private static void GetMethodName<T>(Expression<Action<T>> action) where T : class
        {
            if (action.Body is MethodCallExpression expression)
            {
                Console.WriteLine(expression.Method.Name);
            }
        }

这样就可以拿到函数的命名

特殊关键字

实际上有下面几个关键字是没有文档,可能只有垃圾微软的编译器才知道

__makeref

__reftype

__refvalue

__arglist

不过在 C# 7.2 都可以使用其他的关键字做到一些,详细请看我的 C# 7.0 博客

DebuggerDisplay

如果想要在调试的时候,鼠标移动到变量显示他的信息,可以重写类的 ToString

    public sealed class Foo
    {
        public int Count { get; set; }

        public override string ToString()
        {
            return Count.ToString();
        }
    }

但是如果 ToString 被其他地方用了,如何显示?

垃圾微软告诉大家,使用 DebuggerDisplay 特性

    [DebuggerDisplay("{DebuggerDisplay}")]
    public sealed class Foo
    {
        public int Count { get; set; }

        private string DebuggerDisplay => $"(count {Count})";
    }

他可以使用私有的属性、字段,使用方法很简单

参见Using the DebuggerDisplay Attribute

使用 Unions (C++ 一样的)

如果看到 C++ 可以使用内联,不要说 C# 没有,实际上也可以使用 FieldOffset ,请看下面

[StructLayout(LayoutKind.Explicit)]
public class A
{
    [FieldOffset(0)]
    public byte One;

    [FieldOffset(1)]
    public byte Two;

    [FieldOffset(2)]
    public byte Three;

    [FieldOffset(3)]
    public byte Four;

    [FieldOffset(0)]
    public int Int32;
}

这时就定义了int变量,修改他就是修改其他的三个

     static void Main(string[] args)
    {
        A a = new A { Int32 = int.MaxValue };

        Console.WriteLine(a.Int32);
        Console.WriteLine("{0:X} {1:X} {2:X} {3:X}", a.One, a.Two, a.Three, a.Four);

        a.Four = 0;
        a.Three = 0;
        Console.WriteLine(a.Int32);
    }

这时会输出

2147483647
FF FF FF 7F
65535

接口默认方法

实际上可以给接口使用默认方法,使用的方式

public static void Foo(this IF1 foo)
{
     //实际上大家也看到是如何定义
}

数字格式

string format = "000;-#;(0)";

string pos = 1.ToString(format);     // 001
string neg = (-1).ToString(format);  // -1
string zer = 0.ToString(format);     // (0)

参见:自定义数字格式字符串

stackalloc

实际上很多人都不知道这个,这是不安全代码,从栈申请空间

int* block = stackalloc int[100]; 

参见:stackalloc

调用堆栈

如果需要获得调用方法的堆栈,可以使用这个文章的方法

  class Program
    {
        static void Main(string[] args)
        {
            var foo = new Foo();
            foo.F1();
        }
    }

    public sealed class Foo
    {
        public void F1()
        {
            F2();
        }

        void F2()
        {
            var stackTrace = new StackTrace();
            var n = stackTrace.FrameCount;
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine(stackTrace.GetFrame(i).GetMethod().Name);
            }
        }
    }

输出

F2
F1

参见:WPF 判断调用方法堆栈

指定编译

如果使用 Conditional 可以让代码在指定条件不使用,我写了这个代码,在 Release 下就不会使用 F2

    public sealed class Foo
    {
        public Foo F1()
        {
            Console.WriteLine("进入F1");
            return this;
        }

        [Conditional("DEBUG")]
        public void F2()
        {
            Console.WriteLine("F2");
        }
    }

简单让代码跑一下

        static void Main(string[] args)
        {
            var foo = new Foo();
            foo.F1();
            foo.F2();
        }

结果是什么,大家也知道,在 Debug 和 Release 输出是不相同。但是这么简单的怎么会在这里说,请大家看看这个代码输出什么

     static void Main(string[] args)
        {
            var foo = new Foo();
            foo.F1().F2();
        }

实际上在 Release 下什么都不会输出,F1 不会被执行

true 判断

下面写个见鬼的代码

            var foo = new Foo(10);

            if (foo)
            {
                Console.WriteLine("我的类没有继承 bool ,居然可以这样写");
            }

没错 Foo 没有继承 bool 居然可以这样写

实际上就是重写 true ,请看代码

    public class Foo
    {
        public Foo(int value)
        {
            _count = value;
        }

        private readonly int _count;

        public static bool operator true(Foo mt)
        {
            return mt._count > 0;
        }

        public static bool operator false(Foo mt)
        {
            return mt._count < 0;
        }
    }

是不是觉得很多有人这样写,下面让大家看一个很少人会知道的科技,感谢walterlv

await 任何类型

await "林德熙逗比";

await "不告诉你";

这个代码是可以编译通过的,但是只有在我的设备,然后看了这个博客,可能你也可以在你的设备编译

变量名使用中文

实际上在C#支持所有 Unicode ,所以变量名使用中文也是可以的,而且可以使用特殊的字符

        public string H\u00e5rføner()
        {
            return "可以编译";
        }

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

编者在写这本书时遇到了两个问题。第一个问题是关于数据结构教材。应该说关于数据结构的教材已经很多了。自从美国唐.欧.克努特教授用汇编语言写的《计算机程序设计技巧》第一卷《基本算法》问世以来,已经出现了用PASCAL、C、C++、JAVA等语言写的数据结构书。所以,在编者写本书之前,曾经感到很为难。目前,C#语言作为微软在新一代开发平台.NET推出的、完全面向对象的语言,凭着其简洁、高效、模板、标准化的特性,使得C#语言像程序设计语言中的一件艺术品,也吸引着越来越多的开发人员。这也使得我院的可视化专业进行专业改革时,决定以C#语言作为该专业的主要开发语言。所以说,用C#语言来讲授《数据结构》课程是我院专业改革的结果。而用C#语言写的数据结构教材目前国内基本上是空白。鉴于此,编者决定写本书。 在接下来的写作过程中,编者遇到了另外一个问题,那就是C#语言和.NET Framework的发展。当作者写这本书时,是以C#语言和.NET Framework 的2.0版本来写的。但是,到目前为止,C#语言和.NET Framework已经出现3.0版本了。这使得编者感到了微软技术的发展之快,发出了“学习微软的东西在某种程度上是一种痛苦”之叹!也使编者曾产生了放弃写该书的念头。但作为教师的责任和对新东西的执著使得编者一直坚持,直到该书完稿。也附带说一句:如果读者在阅读过程中,发现有些技术不是最新的技术也不要惊奇,本书是以C#语言和.NET Framework2.0版本来写的。 本书的内容 本书分为8章,第1章介绍了数据结构和算法的基本概念及本书用到的数学和C#的知识;第2章至第6章分别讨论了线性表、栈和队列、串和数组、树型结构和图结构等常用的数据结构及其应用,以及在.NET框架中相应的数据结构;第7、8两章分别讨论了排序和查找常用的各种方法及其应用以及在.NET框架中相应的算法。 本书特点 将数据结构与C#语言和.NET框架结合是本书的一大特点。.NET平台是微软推出的一个新的开发平台,目的是让“不同的语言共享同一平台”。.NET很可能成为下一代Windows操作系统的一部分。而C#语言作为新一代完全面向对象的语言,是.NET的母言。本书所有的数据结构和算法都是用C#语言进行描述,并在相应章节的末尾介绍了在.NET框架中常用的数据结构和算法。用C#在.NET平台开发的技术人员可以从本书中获得许多有益的知识和技术。
房地产信息管理系统是一套功能强大通用性极强的房产管理软件,软件界面设计简洁,美观,其人性化的软件流程,使普通用户不需培训也能快速掌握软件操作使用方法,上手极易。软件支持外部EXCEL表数据导入各种数据,也可以方便导出为Excel,Word等数据格式;报表支持自定义打印。 它集房源管理、客户管理、销售管理、出租管理,统计分析等强大功能为一身,软件界面简洁优美,操作直观简单,无需专门培训即可正常使用。房地产信息管理系统能广泛适用房介经营商、地产代理商等房屋中介销售出租机构使用。房地产信息管理软件是您加强房源管理、客户管理,员工管理,提高工作效率的强大助手。 一、日常管理 1. 新增房源:点击主窗口中的"新增房源"按钮,打开新增房源窗口,按照房源的实际情况进行对应登记后保存即可完成房源的登记,登记后就以用于软件中对房源的查询、修改、签约、房源匹配等操作时使用。 2. 新增客户:点击主窗口中的"新增客户"按钮,打开新增客户窗口,按照客户的实际需求进行对应登记后保存即可完成客户的登记,登记后就以用于软件中对客户的查询、修改、签约、客户匹配等操作时使用。 3. 跟进查询:点击主窗口中的"跟进查询"按钮,打开跟进查询窗口,此窗口中分为房源跟进查询和客户跟进查询两项,在此窗口可以查询到已登记房源和客户的后期跟进情况,通过此查询可以帮助员工了解动态掌握客户的情况,便于及时合理的安排自已的工作。 4. 租房查询:点击主窗口中的"租房查询"按钮,打开房源查询窗口,有此窗口中输入想要查询到的房源条件,即可查到符合条件的房源。大大提高了房源访问速度和要求的精确度,鼠标单击查询到的某个房源,如果有与之匹配的客户,将在主窗口的右下部的"自动匹配的客户"中显示与所点击房源条件相符的需求客户。方便了员工为客户提供更快捷方便的服务。 5. 买房查询:点击主窗口中的" 买房查询"按钮,打开房源查询窗口,有此窗口中输入想要查询到的房源条件,即可查到符合条件的房源。大大提高了房源访问速度和要求的精确度,鼠标单击查询到的某个房源,如果有与之匹配的客户,将在主窗口的右下部的"自动匹配的客户"中显示与所点击房源条件相符的需求客户。方便了员工为客户提供更快捷方便的服务。 二、房源管理 1. 房源管理:点击主窗口左侧的"房源管理" →"房源管理"按钮,打开房源管理窗口,在此窗口中可以对房源进行添加、修改、删除、查询、导出、打印等,还可对每个房源进行客户自动匹配。对房源的添加方式如同在"日常管理"中的添加方式一样。在房源管理中点选某个房源后,在此窗口下半部分的"自动匹配的客户"中将显示与之匹配的客户。 2. 房源跟进:点击主窗口左侧的"房源管理" →"房源跟进"按钮,打开房源跟进窗口,此窗口分为跟进管理和跟进查询两部分,在跟进管理中通过查询房源可以定位对哪一个房源进行跟进,定位房源后在此窗口的下面部分可以对此房源进行添加、修改、删除、打印其跟进信息。在跟进查询部分可以对所有的房源跟进信息按关键字查询。及时掌握房源和客户的进展情况。 3. 成交管理:点击主窗口左侧的"房源管理" →"成交管理"按钮,打开成交管理窗口,此窗口分为成交管理和成交记录两部分,成交管理部分主要完成房源和客户的签约功能,成交记录部分是用来查询所有成交房源的详细信息。 ① 签约:首先在成交管理中查询到要签约的房源,定位房源后,点击成交管理窗口中的签约按钮,打开签约窗口。在此窗口中分为签约登记和提成分配两部分,在签约登记中选择客户类型(如果是已登记客户,真接输入客户编号就可显示出客户信息),填写实际的签约信息;在提成分配中对此次交易需要分配提成的员工进行登记分配比例,以便日后对员工提成进行查询。 ② 修改:对已签约的信息如果发现有误,可以用此功能进行修改。 ③ 合同:此功能主要用于保存传统纸制合同的电子版,以便为以后查找合同提供方便,使用此功能前需要在系统设置中设置合同样本文件,以使于此处使用。 4. 门店招贴:点击主窗口左侧的"房源管理" →"门店招贴"按钮,打开门店招贴窗口,此窗口主要提供招贴单的打印功能,可以选择不同区域的房源或具体到某个房源打印其招贴单,招贴单分小招贴单和大招贴单两种,应用于批量招贴和单个招贴。减少再人工制做招贴单时容易出现错误,并大大提高了工作效率。 三、客户管理 1. 客户管理:点击主窗口左侧的"客户管理" →"客户管理"按钮,打开客户管理窗口,在此窗口中可以对客户进行添加、修改、删除、查询、导出、打印等,还可对每个客户进行房源自动匹配。对客户的添加方式如同在"日常管理"中的添加方式一样。在客户管理中点选某个客户后,在此窗口下半部分的"自动匹配的房源"中将显示与之匹配的房源。 2. 客户跟进:点击主窗口左侧的"客户管理" →"客户跟进"按钮,打开客户跟进窗口,此窗口分为跟进管理和跟进查询两部分,在跟进管理中通过查询客户可以定位对哪一个客户进行跟进,定位客户后在此窗口的下面部分可以对此客户进行添加、修改、删除、打印其跟进信息。在跟进查询部分可以对所有的客户跟进信息按关键字查询。及时掌握客户和房源的进展情况。 3. 签约查询:点击主窗口左侧的"客户管理" →"签约查询"按钮,打开签约查询窗口,在此窗口中可以查询所有的签约信息,可以随时了解到每个客户和房源的签约详情。 4. 来电记录:点击主窗口左侧的"客户管理" →"来电记录"按钮,打开来电记录窗口。此窗口用来查询来电客户的内容,为员工对房源和客户的跟进提供有力的帮助。此功能需配合来电显示猫使用,如果装有来电显示猫,在客户来电时将自动弹出来电登记窗口,操作员可以将客户来电的内容记录下来,就可以在来电记录中查询客户的来电内容。 四、内部统计 1. 房源查询、客源查询:点击主窗口左侧的"内部统计" →"房源查询"按钮,打开员工业绩窗口,此功能主要用来查询本公司员工的业务情况,可以按时间、房屋状态、租售状态、员工编号来查询房源的情况,可以随时了解到公司员工的业绩,对岗位评定和业绩考核提供重要的数据指标。 2. 综合统计:点击主窗口左侧的"内部统计" →"综合统计"按钮,打开综合统计窗口,此功能主要按房源、客源、员工进行横向的一个统计,每项统计有配有相应的直方图。直观的反应出房源、客源、员工等各种属性的数量统计。为管理层业务分析和决策提供有力的信息。 3. 提醒管理:点击主窗口左侧的"内部统计" →"提醒管理"按钮,打开提醒管理窗口,在此窗口可以对提醒信息进行添加、修改、删除、导出、打印等操作,提醒管理主要作用就是起到一个备用录的功能,操作员可以将一些比较重要但又怕忘记处理的事情添加到提醒管理中,根据添加时设置的提醒条件到时系统会自动弹出提示窗口,以便及时提醒员工需要处理的任务,此功能的应用大大减少了漏做工作的事情发生,将宝贵的资源达到合理安排,充份利用的效果,减少员工冗余记忆的功能。 4. 提成明细:点击主窗口左侧的"内部统计" →"提成明细"按钮,打开提成明细窗口,此处的数据来自于"房源管理" →"成交管理"签约时进行的提成分配,在这个窗口可以查到所有员工的提成信息,省去了财务人员对员工提成的大量核算功能,减少了人工核算误差。每一笔明细都清晰的反应出当次提成所依据的签约合同、分成比例、分成金额、分成说明、交易佣金等相关信息。 5. 提成汇总:点击主窗口左侧的"内部统计" →"提成汇总"按钮,打开提成汇总窗口,提成汇总主要是把指定时间段内的员工提成按员工分别汇总,清晰的反映出每位员工在一定时间段内应得的提成金额。也是进行员工业绩评定的一个重要的参考指标。 五、系统设置 1. 公司信息设置:点击主窗口左侧的"系统设置" →"公司信息"按钮,打开公司信息窗口,在此处输入公司的基本信息,在招贴单中可以显示公司信息,也为以后功能升级需要显示公司信息的地方做好准备。 2. 员工管理:点击主窗口左侧的"内部统计" →"管理管理"按钮,打开员工管理窗口,在窗口中可以实现对公司员工的添加、修改、删除、查询等功能。在此添加的员工主要用于在进行置业顾问、提成分配、房源和客户的跟进的员工选择时使用。将公司的每笔业务和处理业务的员工关联起来,便于责任到人和业绩考核等。 3. 操作权限设置:点击主窗口左侧的"系统设置" →"操作权限设置"按钮,打开操作权限设置窗口,此窗口分为上下两下部分。上部分为权限组的管理,主要用于添加、修改、删除权限组;下半部分为操作员的管理,主要用于添加、修改、删除操作员。权限组可以根据公司的实际情况设置多个,然后在添加操作员时选择相应的权限组即可。操作员登录时即只能操作其可操作的权限。 4. 修改当前密码:点击主窗口左侧的"系统设置" →"修改当前密码"按钮,打开修改当前密码,此功能主要用于修改当前操作员的登录密码,旧密码输入正确后才能设置新的密码。 5. 合同样本设置:点击主窗口左侧的"系统设置" →"修改当前密码"按钮,打开合同样本设置,此功能主要用于指定一些格式化合同的存放路径,在签约时可以直接打开相应的合同文本。 6. 初始化数据:点击主窗口左侧的"系统设置" →"初始化数据"按钮,打开初始化数据窗口,在这里可以删除指定的数据,例如:开始使用本软件前可以先删除所有的信息,以便于重新录入本公司的一些房源和客户等信息。 7. 参数信息设置:点击主窗口左侧的"系统设置" →"参数信息设置"按钮,打开参数信息设置窗口,在这里您可以根据您的实际应用情况添加相应的参数据,这些参数涉汲了软件操作的整个流程,也是一些查询的关键条件,所以必须规范设置。 8. 系统操作日志:点击主窗口左侧的"系统设置" →"系统操作日志"按钮,打开系统操作日志窗口,在此可以查询到对数据的修改、删除等有损原始数据的操作,也是对操作员的一种监督。此窗口的数据自动产生,在此只需查询即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值