马化腾:腾讯14年,制胜的7个维度

编者按:腾讯公司首席执行官马化腾近日在《牛津管理评论》分享了他一直以来的思考。这些思考来自腾讯14年来的经验和教训。马化腾说,在腾讯内部的产品开发和运营过程中,有一个词一直被反复提及,那就是”灰度”。他很尊敬的企业家前辈任正非也曾经从这个角度有深入思考,并且写过《管理的灰度》,这里所提倡的灰度,主要是内部管理上的妥协和宽容。
以下为马化腾分享的全文:
从去年合作伙伴大会到现在,已经过去了一年。这一年里,我们大家一起向一个开放的、没有疆界的互联网新生态迈出了第一步。大量的创业伙伴在腾讯开放平台上涌现出来,其中不少团队还取得了初步成功。 Continue reading “马化腾:腾讯14年,制胜的7个维度”

冒择入希快归堆等九种排序算法介绍

昨晚听尚学堂的一个视频,其中主持人有说到几种排序算法的记忆口诀“冒择路(入)兮(希)快归堆”,抽着中午休息的空档,我在这里把这七种排序算法,外加另外2种:桶式排序和基数排序,一并使用Java语言进行简单的介绍。

冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序

一、冒泡排序(BubbleSort)

1. 基本思想:

两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。 Continue reading “冒择入希快归堆等九种排序算法介绍”

.NET中如何使用嵌入的资源

.Net中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Stream。另一种方法是在项目中加入. resx资源文件,在资源文件中添加资源,由ResourceManager类统一管理其中的资源。下面分别详述这两种方法:

使用GetManifestResourceStream读取嵌入资源

  1. 加入资源文件

    直接把要嵌入到程序集的资源文件加入到项目中,可以加在项目的根目录,可以加在项目的任何目录中。

  2. 设置资源文件的“BuildAction”属性

    将嵌入资源文件的“BuildAction”属性设置为“Embedded Resource”

  3. 代码中使用嵌入资源

//获得正在运行类所在的名称空间

Type type = MethodBase.GetCurrentMethod().DeclaringType;

string _namespace = type.Namespace;

//获得当前运行的Assembly

Assembly _assembly = Assembly.GetExecutingAssembly();

//根据名称空间和文件名生成资源名称

string resourceName = _namespace + ".directory.BitmapManifest.bmp";

//根据资源名称从Assembly中获取此资源的Stream

Stream stream = _assembly.GetManifestResourceStream(resourceName);

Image myImage = Image.FromStream(stream);

上述代码中有部分步骤是为了获得resourceName的值,resourceName的值结构形式类似于:”命名空间.目录路径.文件名+后缀”

此外还有一种访问资源的格式:”assembly://SpringSample/Sample.Spring/Resources.BitmapManifest.bmp”,有点像URI格式,不同的是协议为”assembly://”,”SpringSample”为程序集名称,”Sample.Spring”为默认命名空间,”Resources”为目录路径。注意:程序集名称与默认命名空间之间、默认命名空间与目录路径之间用”/”分隔,目录路径与文件名之间用”.”分隔,因为如此我们理解了访问资源的路径方式,就可以直接进行引用了。

使用. resx资源文件嵌入资源

  • 新建资源文件

    在项目中新建一个资源文件,资源文件以.resx为后缀,同时还会新建一个跟资源文件同名的Designer.cs文件。
    其实资源文件最大的用处是用来做多语言版本的软件时保存不同语言的资源,比如不同语言的菜单文本,可以把不同语言的字符串放在同一个资源类型下的不同资源包中,程序运行时根据运行时系统的culture选择不同的包显示不同语言的字符串。
    新建了资源文件后就能往资源文件中添加资源文件:

    资源中可以添加字符串、位图、图标、音频、文件等等的资源。
    添加的资源都会被保存在项目的Resources文件夹中。

  • 设置资源文件的“BuildAction”属性

    Resources文件夹中的所有资源文件的“BuildAction”属性设置为“Embedded Resource”。

  • 资源存在方式

    .resx资源文件管理的资源可以用两种存在形式,一种是以一般的文件形式存在于Resources文件夹中,另一个是经过Base64编码后嵌入到.resx资源文件中。
    打开.resx资源文件,选择资源,在属性中Persistence属性决定资源的存在形式。资源的两种存在形式,在代码中调用都是一样的。

  • 代码中使用嵌入资源
    Icon myIcon = (Icon)Resource1.ResourceManager.GetObject("IconTest");
    Icon myIcon = Resource1.MyIcon
  • 多语言的资源应用

    //得到当前语言环境
    CultureInfo ci = Thread.CurrentThread.CurrentCulture;
    //CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;
    
    Icon myIcon = (Icon)Resource1.ResourceManager("IconText", ci);

设计模式:抽象工厂模式(Abstract Factory)

概述

在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。

意图

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

模型图

逻辑模型:

Continue reading “设计模式:抽象工厂模式(Abstract Factory)”

浅谈C#中子类用new与override的区别

我们先看代码和运行结果,代码:

BaseClass.cs文件:

    public class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("Base Constructed Function");

        }

        public virtual void Execute()
        {
            Console.WriteLine("Base Virtual Execute Function");
        }

        public virtual void Execute2()
        {
            Console.WriteLine("Base Virtual Execute2 Function");
        }

    }

ChildClass.cs文件:

    public class ChildClass : BaseClass
    {
        public ChildClass()
        {
            Console.WriteLine("Children Constructed Function");
        }

        public override void Execute()
        {
            Console.WriteLine("Children Execute Function");
        }

        public new void Execute2()
        {
            Console.WriteLine("Children Execute2 Function");
        }

    }

Program.cs文件:

    class Program
    {
        static void Main(string[] args)
        {
            #region 直接创建子类对象
            ChildClass A = new ChildClass();
            A.Execute();
            A.Execute2();
            #endregion

            #region 使用父类型引用子类型
            BaseClass B = new ChildClass();
            B.Execute();
            B.Execute2();
            #endregion

            Console.ReadKey();
        }
    }

运行结果:

我们有发现:

C# override,重写,是指对父类中的虚方法(标记virtual)或抽象方法(标记为abstract)进行重写,实现新的功能,它必须与父类方法的签名完全一致,而且与父类方法的可访问性也必须一致,此关键字不可以用于重写非虚方法和静态方法,。

new,隐藏,是指在子类中重新定义一个签名与父类方法相同的方法,父类的同名方法只是被隐藏而未被覆盖,这个方法也可以不显示使用new修饰,只是编译时会弹出一个警告信息:如果是有意隐藏,请使用关键字new。