Vorschlag 1: Strings richtig verwenden
String
string str1 = "str1" + 9;
string str2 = "str2" + 9.ToString();
Die erste Codezeile erzeugt eine Box und einen String The concat
und die zweite Codezeile verwendet ToString(), das intern Number.FormatInt32
verwendet, dessen Prototyp
Und ist NumberFormatInt32 ist eine nicht verwaltete Methode, die viel effizienter ausgeführt wird als normaler verwalteter C#-Code, daher ist die zweite Codezeile effizienter als die erste Zeile
Was verwalteten Code und nicht verwalteten Code betrifft, zitiere ich eine Passage aus einem anderen Blog:
托管代码与非托管代码
众所周知,我们正常编程所用的高级语言,是无法被计算机识别的。需要先将高级语言翻译为机器语言,才能被机器理解和运行。
在标准C/C++中,编译过程是这样的:
源代码首先经过预处理器,对头文件以及宏进行解析,然后经过编译器,生成汇编代码,接着,经过汇编,生成机器指令,最后将所有文件连接起来。
这种编译方式的优点在于,最终直接生成了机器码,可以直接被计算机识别和运行,无需任何中间运行环境,但缺点也在于,由于不同平台能够识别的机器码不同,因此程序的跨平台能力较差。
而在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运行,获得托管代码的优势。
| Verwalteter Code und nicht verwalteter CodeWie wir alle wissen, The high -Level-Sprachen, die wir für die normale Programmierung verwenden, können von Computern nicht erkannt werden. Hochsprache muss in Maschinensprache übersetzt werden, bevor sie von der Maschine verstanden und ausgeführt werden kann.
In Standard-C/C++ ist der Kompilierungsprozess wie folgt:
Der Quellcode durchläuft zunächst den Präprozessor, um die Header-Dateien und Makros zu analysieren, durchläuft dann den Compiler, um Assembler-Code zu generieren, durchläuft dann Assembler, um Maschinenanweisungen zu generieren, und verbindet schließlich alle Dateien.
Der Vorteil dieser Kompilierungsmethode besteht darin, dass sie letztendlich direkt Maschinencode generiert, der vom Computer ohne Zwischenlaufumgebung direkt erkannt und ausgeführt werden kann. Der Nachteil besteht jedoch darin, dass verschiedene Plattformen unterschiedliche Maschinencodes erkennen können Leistungsfähigkeit des Programms Schlecht.
In der Java-Sprache wird der Quellcode nicht direkt in Maschinencode übersetzt, sondern in einen Zwischencode (Bytecode) kompiliert. Daher ist für die Ausführung eines Java-Programms eine zusätzliche JRE-Laufumgebung (Java Runtime Enviromental) erforderlich. Wenn das Programm ausgeführt wird, befindet sich eine JVM (Java Virtual Machine). erklärt ist Maschinencode und läuft auf der Maschine.
Der Vorteil der Verwendung von Zwischencode besteht darin, dass das Programm plattformübergreifender ist und nach der Kompilierung auf verschiedenen Geräten ausgeführt werden kann.
„Verwaltet/nicht verwaltet“ ist ein einzigartiges Konzept für das .net-Framework von Microsoft, in dem nicht verwalteter Code auch als nativer Code bezeichnet wird. Ähnlich dem Mechanismus in Java wird der Quellcode zunächst in Zwischencode (MSIL, Microsoft Intermediate Language) kompiliert, und dann kompiliert die CLR in .net den Zwischencode in Maschinencode.
Der Unterschied zwischen C# und Java besteht darin, dass Java zuerst kompiliert und dann interpretiert wird, während C# zweimal kompiliert wird.
Neben den plattformübergreifenden Vorteilen hat die Hosting-Methode auch einen gewissen Einfluss auf die Leistung des Programms. Die Programmleistung geht jedoch über den Rahmen dieses Artikels hinaus und wird hier nicht im Detail besprochen.
Darüber hinaus kann C++ in .net auch verwaltet erweitert werden, sodass C++-Code zur Ausführung auch auf .net und CLR angewiesen ist, wodurch die Vorteile von verwaltetem Code genutzt werden. |
简单理解就是托管代码加了一个中间层,使其可以跨平台,不过效率会降低,而非托管代码就不会产生这样的情况
所以我们编写代码秉承一个原则:尽量减少装箱拆箱
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仅仅不能判断值类型,这里大家可以自己测试一下
相关文章:
C#学习记录:编写高质量代码改善整理建议4-8
C#学习记录:编写高质量代码改善整理建议9-15
Das obige ist der detaillierte Inhalt vonC#-Lernprotokoll: Hochwertigen Code schreiben und Organisationsvorschläge 1–3 verbessern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!