2009-10-21 36 views
24

Khi tôi bắt đầu lập trình OO nhiều năm trước, tôi đã đạt được ấn tượng rằng các biến (nếu đó là từ đúng) là "nguyên thủy" (int, double, etc.) hoặc các đối tượng hạng nhất (String, JPane, v.v.) . Điều này được củng cố bằng một câu trả lời gần đây về nguyên thủy trong Java và C# (@Daniel Pryden: Are primitive types different in Java and C#?). Tuy nhiên không biết liệu C# ValueTypes là nguyên thủy, các đối tượng hoặc một số con thú khác như các đối tượng hạng hai. Tôi thấy rằng SO chỉ sử dụng một thẻ first-class để có thể nó không còn là một thuật ngữ hữu ích nữa.Đối tượng hạng nhất trong Java và C# là gì?

Tôi không tìm thấy the Wikipedia article hữu ích ("Bài viết này cần được sự chú ý của chuyên gia về chủ đề"). Tôi muốn biết ơn về phân loại và sử dụng hiện tại các thuật ngữ, chủ yếu liên quan đến Java và C# (mặc dù có thể các ngôn ngữ khác sẽ làm sáng tỏ).

Làm rõ: Tôi muốn hiểu thuật ngữ hạng nhất và phạm vi sử dụng của nó là gì.

+0

** Tóm tắt **: Sau 5 câu trả lời (30 phút) hình ảnh dường như không có sự nhất trí về "hạng nhất" (ngoại trừ việc nó không hữu ích ở đây) và sự phân biệt giữa nguyên thủy và đối tượng trong C# bị mờ (nguyên thủy có thể có phương thức). Vì vậy, bây giờ tôi không biết những gì một "nguyên thủy" là một trong hai! Nhưng tôi nhận được một ý tưởng rõ ràng hơn về cách thức 'int' C# và' int' Java khác nhau. –

Trả lời

7

Vấn đề là "đối tượng hạng nhất" không phải là khái niệm được xác định rõ.

Cách sử dụng thông thường là ai đó nói rằng "đối tượng" là một lớp vật mà nên có tất cả các thuộc tính X, Y và Z. Nhưng có những thứ khác không có tất cả các thuộc tính đó , nhưng chúng là loại đối tượng-ish. Vì vậy, chúng ta sẽ gọi các đối tượng "lớp đầu tiên" trước đây và phần còn lại không phải là "lớp đầu tiên" ... và có thể không phải là các đối tượng.

Vấn đề là có bất kỳ số lượt xem nào trên các thuộc tính mà một thứ cần phải có để biến nó thành đối tượng "lớp đầu tiên". Và không có khách hàng tiềm năng nào của những người có quan điểm đối lập đến một sự đồng thuận. (Ví dụ, một chuyên gia ngôn ngữ Javascript có thể tranh luận vất vả rằng một đối tượng chỉ là lớp đầu tiên nếu nó là dựa trên mẫu.)

Chỉ có những hiểu biết thực sự vững chắc về "hạng nhất" sẽ là những thứ mà bạn có thể thu thập từ các đặc tả ngôn ngữ tương ứng cho Java và C#. Và chúng chỉ thực sự áp dụng trong phạm vi của các hệ thống ngôn ngữ/loại tương ứng ... và không phải trên nhiều ngôn ngữ.

Vì vậy, "đối tượng Java lớp đầu tiên" hoặc "đối tượng C# hạng nhất" có thể có ý nghĩa, nhưng "đối tượng lớp đầu tiên" được lấy ra khỏi ngữ cảnh thì không.

Vâng đó là quan điểm của tôi ...

+0

Cảm ơn - đây là loại câu trả lời tôi đang tìm kiếm. –

3

Đối với mỗi kiểu dữ liệu nguyên thủy trong Java, thư viện lớp lõi cung cấp lớp bao bọc đại diện cho nó như một đối tượng Java. Ví dụ, lớp Int32 kết thúc tốt kiểu dữ liệu int và lớp Double kết thúc tốt kiểu dữ liệu kép.

Mặt khác, tất cả các kiểu dữ liệu nguyên thủy trong C# là các đối tượng trong không gian tên Hệ thống. Đối với mỗi loại dữ liệu, một tên ngắn hoặc bí danh, được cung cấp. Ví dụ, int là tên viết tắt của System.Int32 và double là dạng ngắn của System.Double.

Danh sách các loại dữ liệu C# và bí danh của chúng được cung cấp trong bảng sau. Như bạn có thể thấy, tám cái đầu tiên tương ứng với các kiểu nguyên thủy có sẵn trong Java. Tuy nhiên, lưu ý rằng boolean của Java được gọi là bool trong C#.

Từ: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx

+0

Lưu ý rằng bạn nói "kiểu dữ liệu nguyên thủy trong C# là đối tượng" - giả sử đây là cách sử dụng đúng, nó làm mờ sự phân biệt giữa nguyên thủy và đối tượng, –

+1

Vâng, tôi không nói, đây là những gì được viết trên MSDN, vui lòng theo liên kết Tôi đã cung cấp ở trên. – Tarik

0

http://onjava.com/onjava/2003/05/21/delegates.html

ở khác từ C# phương pháp là đối tượng hạng nhất bởi vì chúng tôi có thể vượt qua nó trong phương pháp khác. chúng ta có thể sử dụng các phương thức như bất kỳ giá trị nào khác (chuỗi, số, đối tượng do người dùng tạo).

Một ví dụ khác của các đối tượng lớp đầu tiên mà u có thể tìm thấy phổ biến trong các ngôn ngữ khác nhưng C# là Expressions

+0

Phương thức trong C# là * không * đối tượng hạng nhất. Họ có thể, tuy nhiên, được * dỡ bỏ * cho các đối tượng thông qua việc sử dụng các đại biểu hoặc trình bao bọc rõ ràng. –

+0

(Python và Javascript là các ngôn ngữ có phương thức là công dân hạng nhất). –

+0

phương pháp không phải là hạng nhất trong clr. nhưng trong C# họ hạng nhất vì cú pháp. không có vấn đề gì sẽ được thực hiện bởi trình biên dịch hoặc thời gian chạy, chúng tôi nói ở đây về ngôn ngữ. imho :-) –

5

Trong .NET bạn không có loại nguyên thủy vs lớp. Thay vào đó, bạn có cấu trúc so với các lớp, nhưng các cấu trúc chia sẻ nhiều tính năng của các lớp (chẳng hạn như khả năng có các thuộc tính và phương thức) và kế thừa từ lớp Object.

Khi bạn viết int trong C#, ví dụ, nó chỉ là lối tắt ngôn ngữ cho cấu trúc Int32. Bạn có thể làm ví dụ int i=int.Parse("34") hoặc thậm chí string s=1234.ToString(). Để gán các cá thể struct cho các biến kiểu Object, có the boxing/unboxing mechanism.

Trong Java, mặt khác, bạn thực sự là các kiểu nguyên thủy so với các lớp học dicotomy. Vì vậy, ví dụ để thực hiện các hoạt động trên một biến loại int, bạn phải sử dụng lớp phụ trợ Integer. Đó là một trong những điều tôi không thích của Java so với .NET.

EDIT. Khi bạn đọc về "các đối tượng hạng nhất" (hoặc các lớp), nó có nghĩa là "các đối tượng được hỗ trợ đầy đủ", nghĩa là các lớp có cùng khả năng như bất kỳ lớp hệ thống nào khác hoặc các lớp do người dùng tạo. Điều này là để phân biệt với "các loại nguyên thủy hạn chế".

+0

Tôi tự hỏi tại sao điều này đã được bình chọn lên, 'int' không phải là' Int32', một là một loại giá trị khác là một lớp. – Blindy

+6

@Blindy, thực ra cả hai đều là loại giá trị. int là biểu diễn nhanh của 'Int32'. Đó là tất cả – Tarik

+0

P.s: để biết thêm thông tin: http://tinyurl.com/yguowkt, cả hai 'int' và' Int32' là các loại giá trị và được lưu trữ trong ngăn xếp. – Tarik

1

Thẳng thắn mà nói, tôi không có ý tưởng về những gì một "đối tượng hạng nhất" là ...
Nhưng trước tiên tôi thấy sử dụng một thành ngữ tương tự trong tài liệu Lua và gửi thư danh sách, nói rằng chức năng là công dân hạng nhất, hoặc giá trị hạng nhất.

tôi để một trong những tác giả của Lua để giải thích những gì nó là: Programming in Lua : 6 - More about Functions

Nó có nghĩa là, trong Lua, một chức năng là một giá trị với các quyền giống như giá trị truyền thống như số và dây. Các hàm có thể được lưu trữ trong các biến số (cả trên toàn cầu và cục bộ) và trong bảng, có thể được chuyển làm đối số, và có thể được trả về bởi các hàm khác.

Bằng cách nào đó, định nghĩa này áp dụng đối với các đối tượng trong Java: bạn có thể lưu trữ chúng trong các biến, trong mảng, sử dụng chúng như thông số chức năng và trả lại, sử dụng chúng như là chìa khóa của HashMap và các bộ sưu tập khác, vv
Không chắc chắn nếu đó là cách thuật ngữ được sử dụng cho các đối tượng, nhưng ít nhất nó có ý nghĩa ... :-)

Trong một ngôn ngữ như C, các đối tượng phải được làm từ đầu, sử dụng một số thủ thuật (tạo lại C++, bằng cách nào đó ...), do đó, họ không phải là lớp học đầu tiên: bạn phải vượt qua con trỏ xung quanh để thao túng chúng.

+0

Quyền, chức năng là một ví dụ tốt: Hạng Nhất có nghĩa là ở đây "bạn có thể lưu trữ chúng trong Danh sách". Bạn không thể lưu trữ int trong một danh sách Java (ít nhất bạn không thể trong các phiên bản trước đó, bởi vì một int không phải là một đối tượng - bạn có thể bây giờ, nhưng có một số ma thuật liên quan). –

1

Khi chúng ta đang nói về "đối tượng hạng nhất" bởi "đối tượng", chúng tôi có nghĩa là một số khái niệm về ngôn ngữ, không phải là các đối tượng mà chúng ta tạo bằng ngôn ngữ đó. Đó là lý do tại sao cũng có những thuật ngữ như "công dân hạng nhất". Vì vậy, ví dụ, Java có các khái niệm sau đây - Java-objects, Java-primitives, fields, methods và other (bởi các đối tượng Java, tôi ngụ ý bất cứ thứ gì là instance của kiểu Object). Tôi muốn nói rằng trong Java cả Java-đối tượng và Java-nguyên thủy là công dân hạng nhất trong ngôn ngữ.

Trong C#, chúng tôi có một số khái niệm bổ sung mà chúng tôi có thể "kiểm tra" cho các thuộc tính hạng nhất. Ví dụ, đại biểu. Chúng ta có thể gán biến ot delegate (cho một tên), chuyển nó vào phương thức như một đối số, trả về nó từ phương thức, kết hợp trong các cấu trúc dữ liệu (ví dụ như có một từ điển các đại biểu). Vì vậy, tôi nghĩ rằng chúng ta có thể nói rằng các đại biểu là các đối tượng hạng nhất trong C#. Bạn có thể tiếp tục cho các khái niệm khác về C# - sự kiện, thuộc tính ...

Ngôn ngữ chức năng có khái niệm về "chức năng" và tất nhiên nó là công dân hạng nhất trong bất kỳ ngôn ngữ chức năng nào. Tôi muốn nói rằng chúng ta có thể gọi ngôn ngữ là một ngôn ngữ chức năng nếu nó có "chức năng" như là một khái niệm hạng nhất (tên, vượt qua, trả về, kết hợp ...).

Vì vậy, nếu một số ngôn ngữ mang lại một số khái niệm, chúng ta có thể "đo lường" sức mạnh của các khái niệm này theo ngôn ngữ mà bản thân nó mang lại.

+0

Thực ra, tôi không tính đến thuộc tính có thể tạo đối tượng trong thời gian chạy. Vì vậy, từ quan điểm này là các đối tượng không phải là hạng nhất trong C#. –

39

Khái niệm "first-class citizen" or "first-class element" trong ngôn ngữ lập trình đã được giới thiệu bởi nhà khoa học máy tính người Anh Christopher Strachey vào những năm 1960 trong bối cảnh chức năng hạng nhất. Công thức nổi tiếng nhất của nguyên tắc này có thể là Structure and Interpretation of Computer Programs bởi Gerald Jay Sussman và Harry Abelson:

  • Chúng có thể được đặt tên theo biến.
  • Chúng có thể được chuyển làm đối số cho các thủ tục.
  • Chúng có thể được trả lại dưới dạng kết quả của các thủ tục.
  • Chúng có thể được bao gồm trong cấu trúc dữ liệu.

Về cơ bản, điều đó có nghĩa là bạn có thể làm với yếu tố ngôn ngữ lập trình này mọi thứ bạn có thể làm với tất cả các phần tử khác bằng ngôn ngữ lập trình.

+0

không có nghĩa là các số nguyên ('1',' 2' ..) cũng là công dân hạng nhất? –

-1

Đối tượng lớp đầu tiên là những đối tượng mà chúng tôi tạo mà không sử dụng từ khóa 'mới'. Thông thường, chúng tôi tạo một đối tượng sử dụng từ khóa 'mới' nhưng một số đối tượng bằng ngôn ngữ lập trình mà chúng tôi tạo mà không sử dụng từ khóa 'mới'.

Trong java 'Chuỗi' là đối tượng lớp đầu tiên. Nó là một khái niệm java và nó không phải là một khái niệm stander cho tất cả các ngôn ngữ lập trình.

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