2012-04-16 40 views
14

Tôi cần trợ giúp về lập trình C#; Tôi mới đến nó và tôi đến từ nền C. Tôi có một ứng dụng điều khiển như thế này:C# Tạo và sử dụng Chức năng

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Add_Function 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     int a; 
     int b; 
     int c; 

     Console.WriteLine("Enter value of 'a':"); 
     a = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("Enter value of 'b':"); 
     b = Convert.ToInt32(Console.ReadLine()); 

     //why can't I not use it this way? 
     c = Add(a, b); 
     Console.WriteLine("a + b = {0}", c); 
     }//END Main 

     public int Add(int x, int y) 
     { 
     int result = x + y; 
     return result; 
     }//END Add 
    }//END  Program 
}//END   Add_Function 

Nó mang lại cho tôi lỗi này trên dòng mà tôi gọi là Add():

Một tham chiếu đối tượng là cần thiết cho các phi trường tĩnh, phương pháp, hoặc thuộc tính 'Add_Function.Program.Add (int, int)'

Bất cứ ai cũng có thể giải thích cho tôi tại sao tôi gặp sự cố này. Đây có phải là vì kiến ​​trúc của C# khác với C và cách tôi gọi nó là sai? Cảm ơn.

+4

Đây không phải là quá nhiều về C#, vì nó là về OOP và làm thế nào các lớp làm việc với chức năng tĩnh và thành viên. Bạn đang cố gắng gọi một hàm thành viên (yêu cầu một cá thể của một đối tượng) từ một phương thức tĩnh (mà không có một cá thể). –

Trả lời

44

Lưu ý: trong C# từ "hàm số" thường được thay thế bằng thuật ngữ "phương pháp". Vì lợi ích của câu hỏi này không có sự khác biệt, vì vậy tôi sẽ chỉ sử dụng thuật ngữ "chức năng".

Những câu trả lời khác đã đưa cho bạn một cách nhanh chóng để sửa chữa vấn đề của bạn (chỉ cần đảm Add một hàm static), nhưng tôi muốn giải thích tại sao.

C# có mô hình thiết kế khác biệt về cơ bản so với C. Mô hình đó được gọi là lập trình hướng đối tượng (OOP). Giải thích tất cả sự khác biệt giữa OOP và lập trình chức năng nằm ngoài phạm vi của câu hỏi này, nhưng đây là phiên bản ngắn vì nó áp dụng cho bạn.

Viết chương trình của bạn bằng C, bạn đã tạo một hàm có thêm hai số và hàm đó sẽ tồn tại độc lập và có thể gọi từ mọi nơi. Trong hầu hết các hàm C# không tồn tại độc lập; thay vào đó, chúng tồn tại trong ngữ cảnh của một đối tượng. Trong mã ví dụ của bạn, chỉ một cá thể (một đối tượng) của lớp Program biết cách thực hiện Add. Nói cách khác, bạn phải tạo một thể hiện của Program và sau đó yêu cầu Program để thực hiện một Add cho bạn.

Các giải pháp mà mọi người đã cung cấp cho bạn, sử dụng từ khóa static, tuyến đường xung quanh thiết kế đó. Sử dụng từ khóa static giống như nói, "Này, hàm này tôi định nghĩa không cần bất kỳ ngữ cảnh/trạng thái nào, nó chỉ có thể được gọi." Vì hàm Add của bạn rất đơn giản, điều này có ý nghĩa. Khi bạn bắt đầu đi sâu vào OOP, bạn sẽ thấy rằng các hàm của bạn trở nên phức tạp hơn và dựa vào việc biết trạng thái/ngữ cảnh của chúng.

Lời khuyên của tôi: Chọn một cuốn sách OOP và chuẩn bị sẵn sàng để chuyển bộ não của bạn từ lập trình chức năng sang lập trình OOP. Bạn đang ở trong một chuyến đi.

+5

Cảm ơn bạn, tôi luôn luôn đánh giá cao câu trả lời mà đi đến gốc rễ của vấn đề. – CaTx

+2

Trong C#, các hàm và phương thức là hai thứ khác nhau.Hãy xem, ví dụ: tại [chức năng ẩn danh] (https://msdn.microsoft.com/en-us/library/bb882516.aspx) và [các phương thức ẩn danh] (https://msdn.microsoft.com/vi -us/library/0yw3tz5k.aspx). – igorcadelima

1

Lỗi xây dựng nào nói cho bạn biết rằng bạn phải có một phiên bản Program hoặc đặt Add tĩnh.

5

Mã này mang đến cho bạn một lỗi bởi vì chức năng Add của bạn cần phải được static:

static public int Add(int x, int y) 

Trong C# có sự phân biệt giữa các chức năng hoạt động trên các trường hợp (không tĩnh) và chức năng mà không hoạt động trên trường hợp (tĩnh). Các hàm thể hiện có thể gọi các hàm thể hiện khác là các hàm tĩnh vì chúng có tham chiếu ngầm định đối với cá thể. Ngược lại, các hàm tĩnh có thể chỉ gọi các hàm tĩnh, nếu không chúng phải cung cấp một cách rõ ràng một cá thể để gọi hàm không tĩnh.

public static void Main(string[] args) là tĩnh, tất cả các chức năng mà nó gọi cũng cần phải tĩnh.

+0

Xin lỗi, đã đọc sai. Bạn nói đúng. – Servy

16

Bạn có thể nên Add chức năng của bạn static như vậy:

static public int Add(int x, int y) 
{ 
    int result = x + y; 
    return result; 
} //END Add 

static có nghĩa là chức năng không phải là trường hợp lớp học phụ thuộc. Vì vậy, bạn có thể gọi nó mà không cần phải tạo một thể hiện lớp của lớp Program.

hoặc bạn nên tạo ví dụ của lớp Program và sau đó gọi Add trên trường hợp này. Cũng giống như vậy:

Program prog = new Program(); 
prog.Add(5,10); 
+1

Cảm ơn mọi người. Nó thực sự hữu ích. – CaTx

0

Chỉ cần chắc Add chức năng của bạn static bằng cách thêm các từ khóa static như thế này:

public static int Add(int x, int y) 
2

Bởi vì chức năng của bạn là một ví dụ hoặc chức năng không tĩnh bạn nên tạo một đối tượng đầu tiên.

Program p=new Program(); 
p.Add(1,1) 
0

Lý do tại sao bạn có lỗi là do hàm cộng của bạn được xác định sau khi bạn sử dụng hàm này trong chính nếu bạn tạo mẫu thử chức năng trước khi chính lên trên với public int Add(int x, int y); hoặc bạn chỉ có thể sao chép và dán toàn bộ chức năng Add của mình ở trên chính nguyên nhân chính là nơi trình biên dịch bắt đầu thực hiện vì vậy nó không có ý nghĩa để khai báo và xác định một chức năng trước khi bạn sử dụng nó hy vọng rằng sẽ giúp. : D

0

bạn có để làm cho bạn chức năng đang tĩnh như thế này

namespace Add_Function 
{ 
    class Program 
    { 
    public static void(string[] args) 
    { 
     int a; 
     int b; 
     int c; 

     Console.WriteLine("Enter value of 'a':"); 
     a = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("Enter value of 'b':"); 
     b = Convert.ToInt32(Console.ReadLine()); 

     //why can't I not use it this way? 
     c = Add(a, b); 
     Console.WriteLine("a + b = {0}", c); 
    } 
    public static int Add(int x, int y) 
    { 
     int result = x + y; 
     return result; 
    } 
    } 
} 

bạn có thể làm Program.Add thay vì Thêm bạn cũng có thể tạo ra một thể hiện mới của Chương trình bằng cách như thế này

Program programinstance = new Program(); 
1

Lưu ý: trong C# thuật ngữ "hàm" thường được thay thế bằng cụm từ "phương thức". Vì lợi ích của câu hỏi này không có sự khác biệt, vì vậy tôi sẽ chỉ sử dụng thuật ngữ "chức năng".

Điều đó không đúng. bạn có thể đọc về (func type + lambda expression), (chức năng ẩn danh "sử dụng loại đại biểu"), (kiểu hành động + biểu thức Lambda), (kiểu dành cho + biểu thức Lambda). v.v ... ... điều này sẽ hoạt động.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      int a; 
      int b; 
      int c; 

      Console.WriteLine("Enter value of 'a':"); 
      a = Convert.ToInt32(Console.ReadLine()); 

      Console.WriteLine("Enter value of 'b':"); 
      b = Convert.ToInt32(Console.ReadLine()); 

      Func<int, int, int> funcAdd = (x, y) => x + y; 
      c=funcAdd.Invoke(a, b); 
      Console.WriteLine(Convert.ToString(c)); 

     } 

    } 
} 
0
static void Main(string[] args) 
    { 
     Console.WriteLine("geef een leeftijd"); 
     int a = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("geef een leeftijd"); 
     int b = Convert.ToInt32(Console.ReadLine()); 

     int einde = Sum(a, b); 
     Console.WriteLine(einde); 
    } 
    static int Sum(int x, int y) 
    { 
     int result = x + y; 
     return result; 
    } 
-1
static void Main(string[] args) 
    { 
     Console.WriteLine("geef een leeftijd"); 
     int a = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("geef een leeftijd"); 
     int b = Convert.ToInt32(Console.ReadLine()); 

     int einde = Sum(a, b); 
     Console.WriteLine(einde); 
    } 
    static int Sum(int x, int y) 
    { 
     int result = x + y; 
     return result; 
Các vấn đề liên quan