نقل قول:
نوشته شده توسط linux
این کد را بصورت زیر هم می توانید بنویسید
Dim sql AsString = "SELECT *" & vbCrLf & _
"FROM SomeSuchTable" & vbCrLf & _
"WHERE ID='WhatHaveYou'" & vbCrLf & _
"ORDER BY ThisAndThatField ASC "
در مورد vbCrLf، باید از عمگر & استفاده کرد، و فکر نمیکنید که استفاده از این عملگر تاثیری در سرعت برنامه میگذاره (از لحاظ حجم انجام عملیات) ؟
جناب linux، در مورد Select و switch تا حدودی حق با شماست ولی در نظر داشته باشید که در یک فرم خالی در بیسیک.نت، متد Form1_Load خروجی IL به شکل زیر داره:
.method private instance void Form1_Load(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method Form1::Form1_Load
حال کدهای زیر رو در Form1_Load در بیسیک.نت مینویسیم:
Dim A = 0, B AsByte
SelectCase A
Case 0, 1, 2
B = 9
Case 3
B = 10
EndSelect
یک دستور Select ساده، حالا برنامه رو کامپایل کنید و دوباره خروجی IL رو در مورد Form1_Load نگاه کنید، خروجی اش شبیه به زیر هست:
.method private instance void Form1_Load(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// Code size 114 (0x72)
.maxstack 3
.locals init ([0] object A,
[1] uint8 B,
[2] object VB$t_ref$L0)
IL_0000: ldc.i4.0
IL_0001: box [mscorlib]System.Int32
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: stloc.2
IL_0009: ldloc.2
IL_000a: ldc.i4.0
IL_000b: box [mscorlib]System.Int32
IL_0010: ldc.i4.0
IL_0011: call object [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators:: CompareObjectEqual(object,
object,
bool)
IL_0016: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions ::ToBoolean(object)
IL_001b: brtrue.s IL_004d
IL_001d: ldloc.2
IL_001e: ldc.i4.1
IL_001f: box [mscorlib]System.Int32
IL_0024: ldc.i4.0
IL_0025: call object [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators:: CompareObjectEqual(object,
object,
bool)
IL_002a: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions ::ToBoolean(object)
IL_002f: brtrue.s IL_004d
IL_0031: ldloc.2
IL_0032: ldc.i4.2
IL_0033: box [mscorlib]System.Int32
IL_0038: ldc.i4.0
IL_0039: call object [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators:: CompareObjectEqual(object,
object,
bool)
IL_003e: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions ::ToBoolean(object)
IL_0043: brtrue.s IL_004d
IL_0045: ldc.i4.0
IL_0046: box [mscorlib]System.Boolean
IL_004b: br.s IL_0053
IL_004d: ldc.i4.1
IL_004e: box [mscorlib]System.Boolean
IL_0053: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions ::ToBoolean(object)
IL_0058: brfalse.s IL_005f
IL_005a: ldc.i4.s 9
IL_005c: stloc.1
IL_005d: br.s IL_0071
IL_005f: ldloc.2
IL_0060: ldc.i4.3
IL_0061: box [mscorlib]System.Int32
IL_0066: ldc.i4.0
IL_0067: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators:: ConditionalCompareObjectEqual(object,
object,
bool)
IL_006c: brfalse.s IL_0071
IL_006e: ldc.i4.s 10
IL_0070: stloc.1
IL_0071: ret
} // end of method Form1::Form1_Load
حالا دستور switch به شکل زیر باشه در سی#
byte A = 0, B;
switch( A )
{
case 0:
case 1:
case 2:
B = 9;
break;
case 3:
B = 10;
break;
}
خروجی IL تنها به اندازه زیر است:
.method private hidebysig instance void Form1_Load(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// Code size 27 (0x1b)
.maxstack 1
.locals init ([0] uint8 A,
[1] uint8 CS$0$0000)
IL_0000: ldc.i4.0
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: stloc.1
IL_0004: ldloc.1
IL_0005: switch (
IL_001a,
IL_001a,
IL_001a,
IL_001a)
IL_001a: ret
} // end of method Form1::Form1_Load
لطفا به تفاوت کد Select من و خودتون دقت کنید! یعنی اینقدر تفاوت زیاد بود ؟!
خب، حالا در این مورد، از نظر شما بیسیک.نت چه کار اضافی انجام داده که حجم IL اش اینقدر از سی# بیشتره؟!
نقل قول:
نوشته شده توسط linux
در مورد اختلاف بین اندازه فایلهای سی شارپ و ویبی اگر شما این کدها بالا را کامپایل کنید 8 کیلوبایت فایل exe ویبی بزرگتر خواهد بود بخاطر استفاده از کلاس my که در C# نیست
نکته جالبی بود، ممنون.