Maison  >  Article  >  développement back-end  >  Dossier d'apprentissage C# : écriture de code de haute qualité et amélioration des suggestions d'organisation 1-3

Dossier d'apprentissage C# : écriture de code de haute qualité et amélioration des suggestions d'organisation 1-3

php是最好的语言
php是最好的语言original
2018-08-06 14:54:101712parcourir

Suggestion 1 : Utiliser correctement les chaînes

chaîne

string str1 = "str1" + 9;
string str2 = "str2" + 9.ToString();

La première ligne de code générera une boxe, et une chaîne concat

et la deuxième ligne de code utilise ToString(), qui utilise Number.FormatInt32

en interne et son prototype est

Dossier dapprentissage C# : écriture de code de haute qualité et amélioration des suggestions dorganisation 1-3

NumberFormatInt32 est une méthode non gérée et son efficacité de fonctionnement est bien supérieure à celle du code géré C# normal, donc l'efficacité de la deuxième ligne de code est supérieure à celle de la première ligne

Quant à ce qu'est le code managé et le code non managé , j'ai cité un passage d'un autre blog :

托管代码与非托管代码

众所周知,我们正常编程所用的高级语言,是无法被计算机识别的。需要先将高级语言翻译为机器语言,才能被机器理解和运行。
在标准C/C++中,编译过程是这样的:
enter description here
源代码首先经过预处理器,对头文件以及宏进行解析,然后经过编译器,生成汇编代码,接着,经过汇编,生成机器指令,最后将所有文件连接起来。
这种编译方式的优点在于,最终直接生成了机器码,可以直接被计算机识别和运行,无需任何中间运行环境,但缺点也在于,由于不同平台能够识别的机器码不同,因此程序的跨平台能力较差。
而在Java语言中,源代码并没有被直接翻译成机器码,而是编译成了一种中间代码(字节码Bytecode)。因此,运行Java程序需要一个额外的JRE(Java Runtime Enviromental)运行环境,在JRE中存在着JVM(Java Virtual Mechinal,Java虚拟机),在程序运行的时候,会将中间代码进一步解释为机器码,并在机器上运行。
使用中间代码的好处在于,程序的跨平台性比较好,一次编译,可以在不同的设备上运行。
托管/非托管是微软的.net framework中特有的概念,其中,非托管代码也叫本地(native)代码。与Java中的机制类似,也是先将源代码编译成中间代码(MSIL,Microsoft Intermediate Language),然后再由.net中的CLR将中间代码编译成机器代码。
而C#与Java的区别在于,Java是先编译后解释,C#是两次编译。
托管的方式除了拥有跨平台的优点之外,对程序的性能也产生一定的影响。但程序性能不在本文讨论的范围,这里不在赘述。
此外,在.net中,C++也可以进行托管扩展,从而使C++代码也依赖于.net和CLR运行,获得托管代码的优势。

Code managé et code non managé Comme nous tout le monde le sait, les langages de haut niveau que nous utilisons pour la programmation normale ne peuvent pas être reconnus par les ordinateurs. Le langage de haut niveau doit être traduit en langage machine avant de pouvoir être compris et exécuté par la machine. En C/C++ standard, le processus de compilation est le suivant : entrez la description ici Le code source passe d'abord par le préprocesseur pour analyser les fichiers d'en-tête et les macros, puis passe par le compilateur pour générer du code assembleur, puis passe par l'assembleur pour générer des instructions machine et enfin connecte tous les fichiers. L'avantage de cette méthode de compilation est qu'elle génère finalement directement du code machine, qui peut être directement reconnu et exécuté par l'ordinateur sans aucun environnement d'exécution intermédiaire. Cependant, l'inconvénient est que, comme différentes plates-formes peuvent reconnaître différents codes machine, le multiplateforme. capacité du programme Faible. Dans le langage Java, le code source n'est pas directement traduit en code machine, mais compilé en un code intermédiaire (Bytecode). Par conséquent, l'exécution d'un programme Java nécessite un environnement d'exécution JRE (Java Runtime Enviromental) supplémentaire. Il existe une JVM (Java Virtual Machine, Java Virtual Machine) lorsque le programme est en cours d'exécution, le code intermédiaire sera plus loin . expliqué est un code machine et s'exécute sur la machine. L’avantage d’utiliser du code intermédiaire est que le programme est plus multiplateforme et peut être exécuté sur différents appareils une fois compilé. Géré/non géré est un concept unique au framework .net de Microsoft, dans lequel le code non géré est également appelé code natif. Semblable au mécanisme de Java, le code source est d'abord compilé en code intermédiaire (MSIL, Microsoft Intermediate Language), puis le CLR de .net compile le code intermédiaire en code machine. La différence entre C# et Java est que Java est d'abord compilé puis interprété, tandis que C# est compilé deux fois. En plus de ses avantages multiplateformes, la méthode d'hébergement a également un certain impact sur les performances du programme. Cependant, les performances du programme dépassent le cadre de cet article et ne seront pas abordées en détail ici. De plus, dans .net, le C++ peut également être géré de manière étendue, de sorte que le code C++ s'appuie également sur .net et CLR pour s'exécuter, bénéficiant ainsi des avantages du code managé.

简单理解就是托管代码加了一个中间层,使其可以跨平台,不过效率会降低,而非托管代码就不会产生这样的情况

所以我们编写代码秉承一个原则:尽量减少装箱拆箱

StringBuilder

StringBuilder的效率来源于预先以非托管的方式分配内存,如果没有预先定义长度,默认长度为16,不够的时候会重新分配内存,依次加16的倍数,所以如果你提前知道字符串需要的最大长度,最好预先定义好,这样就不会频繁分配内存从而带来效率的降低

2、使用默认转型方法

这个建议的大体内容是尽量使用系统所带的转换类型的方法

例如 int.Parse  ToString()  System.Convert 等等

3、区别对待强转类型和as  is

两个类型之间转换有两种情况

1. 他们是父子类的关系: ChildType  =  (ChildType)ParentType

2.没有继承关系,或者继承同一个父类,这时候就需要重写强转方法

class FirstType
{
    public string Name { get; set; }
}

class SecondType
{
    public string Name { get; set; }
        
    public static explicit operator SecondType(FirstType firstType)
    {
        SecondType secondType = new SecondType() { Name = firstType.Name };
        return secondType;
    }
}

FirstType firstType = new FirstType() { Name = "张" };
SecondType secondType = (SecondType)firstType;

如果是继承的关系,为了效率推荐使用 ChildType = ParentType as ChildType

这个就更上面提到的,尽量使用系统方法的转换,而不是强制转换

我写Unity的时候有这样一个需求,右键点击装备的时候会使用,装备有Equipment,Weapon,我们需要判断是Equipment还是Weapon类型,它们都是继承Item类型,有两种方法可用:

Weapon weapon = item as Weapon;
if(weapon != null)
{
    //TODO 使用武器
}

if(item is Weapon)
{
    weapon weapon = item as Weapon;
    //TODO 使用武器
}

第一种方法只判断了一次类型,而第二种方法判断了两次类型

书上说as不能判断基元类型,但是经过我的测试发现书上写错了,as仅仅不能判断值类型,这里大家可以自己测试一下

Dossier dapprentissage C# : écriture de code de haute qualité et amélioration des suggestions dorganisation 1-3

Dossier dapprentissage C# : écriture de code de haute qualité et amélioration des suggestions dorganisation 1-3

相关文章:

C#学习记录:编写高质量代码改善整理建议4-8

C#学习记录:编写高质量代码改善整理建议9-15

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn