Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: ý nghĩa của một số từ khóa trong C#

  1. #1
    Ngày gia nhập
    01 2008
    Bài viết
    240

    Mặc định ý nghĩa của một số từ khóa trong C#

    hi all
    mình không hiểu một số từ khóa trong C# sau để làm gì và khi không có nó thì ta gặp khó khăn gì mong các bạn giải thichs hộ
    1: Serializable
    2:Attribute
    3:Reflection
    thanks

  2. #2
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Attribute
    1 attribute là 1 thứ dùng để đánh dấu (marker) mà được ứng dụng đến 1 phương thức hay 1 lớp thậm chí là 1 đối số riêng trong 1 phưong thức ,cung cấp thông tin thêm về mục đó. ví dụ attribute Conditional có thể được dùng để đánh dấu 1 phương thức như là 1 phương thức debug như sau :
    [Conditional("DEBUG")]
    public void DoSomeDebugStuff()
    {
    // do something
    }

    Để áp dụng 1 attribute đến 1 mục ta cung cấp tên của attribute trong ngoặc vuông ngay trước định nghĩa mục. các attribute lấy vài thông số - những thông số này cung cấp bên trong dấu ngoặc theo sau tên attribute
    Ở cấp độ cơ bản nhất của nó , ứng dụng 1 attribute vào 1 mục có thể đơn giản chỉ là thông tin thêm về mục đó đựợc bỏ trong assembly đuợc biên dịch dùng cho mục đích hướng dẫn thêm. 1 số attribute được định nghĩa trong các lớp cơ sở đuợc nhận ra bởi trình biên dịch C#.mà từ đó trình biên dịch có thể gây ra những tác động trên mã . ví dụ trên trình biên dịch sẽ biên dịch mã của mục Conditional chỉ nếu biểu tượng DEBUG đã được định nghĩa trước.
    Trong phần này ta sẽ xem xét 3 attribute sau :
    - Conditional : có thể đánh dấu bất kì phương thức với attribute Conditional . sẽ ngăn ngừa trình biên dịch từ việc biên dịch phương thức đó hay bất kì câu lệnh mà tham khảo đến nó nếu tên biểu tượng không được định nghĩa. điều này có thể được dùng cho điều kiện biên dịch .
    - Dllimport - đôi khi ta cần truy nhập đến các Window API cơ bản hoặc các hàm kiểu cũ khác mà được thực thi trong các window DLLs.attribute Dllimport dùng cho mục đích này . nó được dùng đánh dấu 1 phương thức được định nfghĩa trong Dll bên ngoài.
    - Obsolete - attribute này được dùng để đánh dấu 1 phương thức được xem như obsolete ( không dùng nữa) . tuỳ thuộc vào việc thiết lập trên attribute này , trình biên dịch sẽ sinh ra 1 cảnh báo hay lỗi nếu nó gặp bất kì mã nào cố gắng dùng phương thức này.
    Ta xem xét các attribute này thông qua ví dụ Attributes . trình bày 1 message box dùng hàm Window API ,MessageBox , và cũng trình bày 2 thông điệp vá lỗi. 1 trong những thông điệp này được gọi trung gian qua 1 phương thức obsolete


    #define DEBUG // comment out this line if doing a release build

    using System;
    using System.Runtime.InteropServices;
    using System.Diagnostics;

    namespace Wrox.ProCSharp.AdvancedCSharp
    {

    class MainEntryPoint
    {
    [DllImport("User32.dll")]
    public static extern int MessageBox(int hParent, string Message,
    string Caption, int Type);

    static void Main()
    {
    DisplayRunningMessage();
    DisplayDebugMessage();
    MessageBox(0, "Hello", "Message", 0);
    }

    [Conditional("DEBUG")]
    private static void DisplayRunningMessage()
    {
    Console.WriteLine("Starting Main routine. Current time is " +
    DateTime.Now);
    }

    [Conditional("DEBUG")]
    [Obsolete()]
    private static void DisplayDebugMessage()
    {
    Console.WriteLine("Starting Main routine");
    }
    }
    }

    Đầu tiên ta chỉ định một số namespace
    - DllImport nằm trong namespace System.Runtime.InteropServices
    - Conditional nằm trong namespace System.Diagnostics .
    Bên trong phương thức ta định nghĩa phương thức mà ta gọi từ dll bên ngoài .hàm API MessageBox() đuợc định nghĩa trong User32.dll, vì thế ta truyền tên tập tin vào attribute DllImport . ta khai báo hàm giống như trong C.
    Tiếp theo trong phương thức DisplayDebugMessage() , ta chỉ muốn phương thức này chạy nếu ta đang làm 1 xây dựng vá lỗi, vì thế ta đánh dấu nó như là conditional trên biểu tượng DEBUG .ta cũng xem phương thức này là 1 obsoblete , bởi vì ta đã viết một phiên bản tốt hơn, DisplayRunningMessage(), mà trình bày thêm thời gian và ngày tháng.ta không khuyến khích mọi người dùng DisplayDebugMessage() thêm nữa, vì thế ta đánh dấu nó với attribute Obsolete để trình biên dịch sẽ trình bày 1 cảnh báo nếu phương thức này được dùng. có 1 vài kiểu overload của hàm này :
    [Obsolete("The DisplayDebugMessage is obsolete. Use " +
    "DisplayRunningMessage instead.")]
    Hàm này sẽ sinh ra một cảnh báo nếu phương thức này được dùng, trong khi :
    [Obsolete("The DisplayDebugMessage is obsolete. Use " +
    "DisplayRunningMessage instead.", true)]
    sẽ gây ra lỗi biên dịch thay vì là 1 cảnh báo nếu phương thức này được dùng. thông số thứ hai quy định đây là lỗi hay là cảnh báo nếu obsolete được dùng .
    Về attribute Conditional , đây là 1 attribute phức tạp , bởi vì nếu điều kiện không hợp, trình biên dịch không chỉ không biên dịch đoạn mã trong phương thức mà còn tự động bỏ qua bất kì dòng nào mã khác trong tập tin nguồn mà gọi phương thức này . để trình biên dịch có khả năng làm điều này phương thức phải trả về void . attribute Conditional chỉ có thể áp dụng đến phương thức hoàn chỉnh như là 1 đơn vị biên dịch
    Chạy ví dụ trên với biểu tượng DEBUG đưọc định nghĩa cho ra kết quả . lưu ý cảnh báo được đưa ra :
    csc Attributes.cs
    Microsoft (R) Visual C# .NET Compiler version 7.00.9466
    for Microsoft (R) .NET Framework version 1.0.3705
    Copyright (C) Microsoft Corporation 2001. All rights reserved.

    Attributes.cs(19,10): warning CS0612:
    'Wrox.ProCSharp.AdvancedCSharp.MainEntryPoint.Disp layDebugMessage()'
    is obsolete

    Attributes
    Starting Main routine. Current time is 12/02/2002 18:47:32
    Starting Main routine
    Reply With Quote
    Trích từ ddth.com,có thêm tra thêm ở msdn
    Cánh Chym ứ mỏi

  3. #3
    Ngày gia nhập
    01 2008
    Bài viết
    240

    Trích dẫn Nguyên bản được gửi bởi dieucay555 Xem bài viết
    Trích từ ddth.com,có thêm tra thêm ở msdn
    Code:
    [Conditional("DEBUG")]
    private static void DisplayRunningMessage()
    {
    Console.WriteLine("Starting Main routine. Current time is " +
    DateTime.Now);
    }
    
    [Conditional("DEBUG")]
    [Obsolete()]
    private static void DisplayDebugMessage()
    {
    Console.WriteLine("Starting Main routine");
    }
    thanks bạn
    bạn cho mình hoi hêm nhé
    [Conditional("DEBUG")]mình khai báo nó để mình debug hàm này đúng không?, sao mình chạy thử nó nó cứ chạy vèo vèo luôn, đến đoạn này nó không dùng lại như kiểu mình press F9.
    Một phương thức được đánh dấu là có thuộc tính này [Obsolete()] thì có nghĩa là nó thông báo là không nên dùng, đã không nên dùng sao không delete nó đi luôn còn để làm gì

  4. #4
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Tất cả các cái trên không có cái nào là keywork, tất cả đều là tên của Attribute hoặc NameSpace, (Tên class đầy đủ của Coditional là CoditionalAttribute, Serializable là SeializableAttribute)

    Obsolete attribute được sử dụng mà không bỏ cái hàm đó đi là nhằm tương thích phiên bản. Khi bạn update phiên bản assembly của mình lên, có phương thức tốt hơn phương thức cũ, bạn không muốn nhưng người từ nay về sau sử dụng cái phương thức cũ nữa, nhưng nhưng assembly khác đã reference đến assembly của mình trước đây có thể đã sử dụng phương thức cũ, nếu giờ bỏ nó đi thì các assembly khác đó đều không dùng được nữa => cần phải update hết :((

    Các .Net hỗ trợ meta data, đây là thông tin gắn thêm cho một phần nào đó trong chương trình (field, method, class, struct, assembly). Nó không được tính là mã lệnh nên không debug theo kiểu bình thường được. Các lớp diễn tả nó chỉ được khởi tạo khi có đoạn mã lệnh nào đó sử dụng meta data này.

    Khi bạn thêm một attribute cho một thành phần, đơn giản chỉ là bạn nói lên rằng thành phần đó có tính chất nào đó. Nếu như không có thằng nào quan tâm đến cái tính chất đó thì nó cũng chỉ là vô nghĩa. Ví dụ Obsolete thì được Compiler quan tâm, DllInport thì được RuntimeInterlop quan tâm (quả thực thì không hiểu làm cách nào nó quan tâm đến thằng này được - không lẽ bất cứ lệnh call nào cũng giám sát thì có chít performent), Serializable và NonSerializabe thì được các serializer quan tâm.

    Khi bạn cần quan tâm đến một attribute nào đó của một thành phần nào đó (field, method....) bạn chỉ có cách là dùng Reflection.

  5. #5
    Ngày gia nhập
    01 2008
    Bài viết
    240

    Trích dẫn Nguyên bản được gửi bởi zxc Xem bài viết
    Tất cả các cái trên không có cái nào là keywork, tất cả đều là tên của Attribute hoặc NameSpace, (Tên class đầy đủ của Coditional là CoditionalAttribute, Serializable là SeializableAttribute)

    Obsolete attribute được sử dụng mà không bỏ cái hàm đó đi là nhằm tương thích phiên bản. Khi bạn update phiên bản assembly của mình lên, có phương thức tốt hơn phương thức cũ, bạn không muốn nhưng người từ nay về sau sử dụng cái phương thức cũ nữa, nhưng nhưng assembly khác đã reference đến assembly của mình trước đây có thể đã sử dụng phương thức cũ, nếu giờ bỏ nó đi thì các assembly khác đó đều không dùng được nữa => cần phải update hết :((

    Các .Net hỗ trợ meta data, đây là thông tin gắn thêm cho một phần nào đó trong chương trình (field, method, class, struct, assembly). Nó không được tính là mã lệnh nên không debug theo kiểu bình thường được. Các lớp diễn tả nó chỉ được khởi tạo khi có đoạn mã lệnh nào đó sử dụng meta data này.

    Khi bạn thêm một attribute cho một thành phần, đơn giản chỉ là bạn nói lên rằng thành phần đó có tính chất nào đó. Nếu như không có thằng nào quan tâm đến cái tính chất đó thì nó cũng chỉ là vô nghĩa. Ví dụ Obsolete thì được Compiler quan tâm, DllInport thì được RuntimeInterlop quan tâm (quả thực thì không hiểu làm cách nào nó quan tâm đến thằng này được - không lẽ bất cứ lệnh call nào cũng giám sát thì có chít performent), Serializable và NonSerializabe thì được các serializer quan tâm.

    Khi bạn cần quan tâm đến một attribute nào đó của một thành phần nào đó (field, method....) bạn chỉ có cách là dùng Reflection.
    thanks, thật dẽ hiểu

Các đề tài tương tự

  1. từ khóa static trong C có ý nghĩa gì?
    Gửi bởi golden_illusion trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 11-08-2014, 09:17 PM
  2. Lập trình C++ cho hỏi nghĩa của từ khóa endl trong C++
    Gửi bởi huunhanit trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 11-01-2013, 05:41 PM
  3. Kỹ thuật C++ từ khóa item trong khai báo cấu trúc mảng của cây nhị phân có nghĩa gì?
    Gửi bởi quan92_cn2 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 13-04-2012, 10:52 AM
  4. Từ khóa restrict trong chuẩn C99 có nghĩa là gì?
    Gửi bởi haian trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 2
    Bài viết cuối: 16-07-2011, 11:55 AM
  5. Ý nghĩa từ khóa this trong lập trình C#???
    Gửi bởi 1101 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 20-01-2011, 06:55 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn