2010-04-09 32 views
12

Câu hỏi nhanh, có cách nào để gọi phương thức chính của bạn bất cứ điều gì bạn thích? Hay nó phải được gọi là "Main()"?C# Cách đặt tên cho phương thức Main() của chính bạn?

+0

Điều này chưa bao giờ xuất phát từ tôi, chỉ vì bạn có thể chỉ có một dòng bên trong Main() và từ đó gọi bất cứ điều gì bạn muốn. Tôi quan tâm đến câu trả lời mặc dù .. –

+0

Có lý do nào khác ngoài sự tò mò không? Một người nào đó có báo giá như thế này "Nếu gỡ lỗi gấp đôi mã viết mới, thì theo định nghĩa bạn không đủ thông minh để gỡ lỗi mã 'thông minh nhất' mà bạn có thể đưa ra." Lộn xộn với các công ước rơi bình phương trong thể loại đó. –

Trả lời

18

Lưu ý đây là quy ước C#, chứ không phải quy ước .NET Runtime. Bạn có thể đặt tên cho phương pháp của bạn bất cứ điều gì bạn muốn trong IL:

.module Mane.exe 
.subsystem 3 
.corflags 9 

.assembly extern mscorlib 
{ 
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89) 
    .ver 2:0:0:0 
} 

.assembly Mane 
{ 
    .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = (01 00 00 00 00) 
    .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00) 
    .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = (01 00 07 31 2E 30 2E 30 2E 30 00 00) 
    .custom instance void [mscorlib]System.Resources.NeutralResourcesLanguageAttribute::.ctor(string) = (01 00 05 65 6E 2D 55 53 00 00) 

    .permissionset reqmin 
       = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'Execution' = bool(true)}} 
    .hash algorithm 0x00008004 
    .ver 1:0:0:0 
} 

.namespace Mane 
{ 
    .class private abstract auto ansi sealed beforefieldinit Program extends [mscorlib]System.Object 
    { 
     .method private hidebysig static void Mane() cil managed 
     { 
      .entrypoint 
      .maxstack 1 
      ldstr "Hello, World!" 
      call void [mscorlib]System.Console::WriteLine(class System.String) 
      ret 
     } 
    } 
} 
+0

Cảm ơn câu trả lời tuyệt vời. Thực sự thú vị – Chilln

+1

Bạn đang rất hoan nghênh, cảm ơn vì các kudo. Như một suy nghĩ, tôi tự hỏi nếu một công cụ như PostSharp có thể tiêm phần thích hợp của IL (.entrypoint) vào một phương thức được trang trí với một thuộc tính cụ thể và do đó obviate C# "giới hạn" của điểm đầu vào cần phải được đặt tên chính(). –

1

Nó phải được gọi là Main().

1

Nó cần được gọi là Main() vì đó là điểm vào cho ứng dụng.

Tên và hạn chế được định nghĩa bởi Khung. Dưới đây là các trang MSDN để tham khảo:

Main (C#)

+0

Rõ ràng đây là một quy ước C#, không phải là quy ước .NET Framework. –

+0

@Justin: Bạn có nhận ra rằng bạn đã cung cấp liên kết .NET 1.1 không? Tôi đã sửa nó để không có số phiên bản. –

1

Nó phải được gọi là Main.

Nếu bạn thực sự muốn, bạn có thể tạo phương pháp của riêng mình và chỉ gọi nó là dòng mã một lần duy nhất trong Main.

public static void Main(String[] args) 
{ 
    Mane(args); 
} 
+0

Bất kỳ lý do gì để công khai Chính? MSDN nói rằng nó không được công khai ... – IVlad

1

Không ... Chính là tiêu chuẩn. Những gì bạn có thể làm là thay đổi lớp lưu trữ phương thức Chính từ cài đặt "Đối tượng khởi động" của thuộc tính dự án

Nhưng thực sự, tại sao bạn muốn? mọi người đều biết rằng đó là chính ... vì vậy bạn muốn thể gây nhầm lẫn các nhà phát triển khác có thể nhìn vào mã của bạn

1

Từ "Main() and Other Methods (C# vs Java)":

Mỗi C ​​# ứng dụng phải có một phương thức Main đơn ghi rõ nơi thực hiện chương trình là bắt đầu.

+0

@ brydgesk: hãy cố gắng cung cấp các liên kết MSDN mà không có số phiên bản trong đó. Họ sẽ luôn luôn là hiện tại. –

5

Bạn có thể gọi phương thức chính của mình, nhưng phương thức này sẽ không được gọi là phương thức đầu tiên trong đơn của bạn trừ khi được gọi là Main. Có một vài yêu cầu khác và những điều cần lưu ý. Từ MSDN:

  • Phương thức chính là điểm vào của chương trình, nơi chương trình bắt đầu và kết thúc chương trình.
  • Nó được khai báo bên trong một lớp hoặc cấu trúc. Nó phải tĩnh và không được công khai.
  • Có thể có loại khoảng trống hoặc kiểu trả về int.
  • Phương thức chính có thể được khai báo có hoặc không có tham số.
  • Tham số có thể được đọc dưới dạng đối số dòng lệnh không được lập chỉ mục.
  • Không giống như C và C++, tên của chương trình không được coi là đối số dòng lệnh đầu tiên.
+0

@Mark: tốt nhất là cung cấp các liên kết MSDN không có số phiên bản, vì chúng sẽ luôn tham chiếu đến phiên bản hiện tại. –

3

Tôi không tin rằng có một cách để làm điều đó trên C# bên thứ nhưng nếu bạn sẵn sàng để chỉnh sửa IL của bạn nó rất dễ dàng đủ để đi vào và thêm .entrypoint vào hàm trong IL. Kiểm tra mục CLI trên wikipedia.

Các vấn đề liên quan