Các giải pháp lập trình CSharp- P72 doc

10 259 0
Các giải pháp lập trình CSharp- P72 doc

Đang tải... (xem toàn văn)

Thông tin tài liệu

601 Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý số bằng tham chiếu, bạn chỉ cần khai báo một biến đối tượng, thiết lập nó là Type.Missing , và sử dụng nó trong mọi trường hợp: private static object n = Type.Missing; Ví dụ dưới đây sử dụng đối tượng Word để tạo và hiển thị một tài liệu. Trong đó, có nhiều phương thức yêu cầu các thông số tùy chọn (được truyền bằng tham chiếu). Việc sử dụng trường Type.Missing đơn giản hóa mã lệnh rất nhiều. using System; public class OptionalParameters { private static object n = Type.Missing; private static void Main() { // Chạy Word phía nền. Word.ApplicationClass app = new Word.ApplicationClass(); app.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; // Tạo một tài liệu mới (không khả kiến đối với người dùng). Word.Document doc = app.Documents.Add(ref n, ref n, ref n, ref n); Console.WriteLine(); Console.WriteLine("Creating new document."); Console.WriteLine(); // Thêm một tiêu đề và hai hàng text. Word.Range range = doc.Paragraphs.Add(ref n).Range; range.InsertBefore("Test Document"); string style = "Heading 1"; object objStyle = style; range.set_Style(ref objStyle); range = doc.Paragraphs.Add(ref n).Range; range.InsertBefore("Line one.\nLine two."); range.Font.Bold = 1; // Hiển thị Print Preview, làm cho Word trở nên khả kiến. doc.PrintPreview(); app.Visible = true; 602 Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý Console.ReadLine(); } } 9. 9. S d ng đi u ki m ActiveX trong .NETử ụ ề ể S d ng đi u ki m ActiveX trong .NETử ụ ề ể - - client client   Bạn cần đặt một điều kiểm ActiveX trên một cửa sổ ứng dụng . NET Framework .   Sử dụng một RCW (cũng giống như với một thành phần COM bình thường). Để làm việc với điều kiểm ActiveX khi thiết kế, thêm nó vào hộp công cụ của Visual Studio .NET . .NET Framework hỗ trợ như nhau đối với tất cả các thành phần COM, bao gồm điều kiểm ActiveX. Điều khác nhau cơ bản là lớp RCW (cho điều kiểm ActiveX) dẫn xuất từ kiểu .NET đặc biệt System.Windows.Forms.AxHost . Về mặt kỹ thuật, bạn thêm AxHost vào form, và nó sẽ giao tiếp với điều kiểm ActiveX phía hậu trường. Vì dẫn xuất từ System.Windows.Forms.Control , nên AxHost cũng có các thuộc tính, phương thức, và sự kiện chuẩn như Location , Size , Anchor , Nếu RCW được sinh tự động, các lớp AxHost luôn bắt đầu bằng Ax . Bạn có thể tạo một RCW cho một điều kiểm ActiveX cũng giống như cho bất cứ thành phần COM nào khác bằng công cụ Tlbimp.exe hoặc tính năng Add Reference trong Visual Studio .NET, sau đó lập trình để tạo điều kiểm. Tuy nhiên, một cách tiếp cận dễ hơn trong Visual Studio .NET là thêm điều kiểm ActiveX vào hộp công cụ (xem mục 11.4 để biết thêm chi tiết). Chẳng có gì xảy ra khi bạn thêm một điều kiểm ActiveX vào hộp công cụ. Tuy nhiên, bạn có thể sử dụng biểu tượng trong hộp công cụ để thêm một thể hiện của điều kiểm vào form. Lần đầu bạn làm việc này, Visual Studio .NET sẽ tạo một Interop Assembly và thêm nó vào dự án của bạn. Ví dụ, nếu bạn thêm điều kiểm Microsoft Masked Edit (không có điều kiểm .NET tương đương), Visual Studio .NET sẽ tạo một RCW Assembly có tên là AxInterop.MSMask.dll. Dưới đây là đoạn mã trong vùng designer dùng để tạo một thể hiện của điều kiểm này và thêm nó vào form: this.axMaskEdBox1 = new AxMSMask.AxMaskEdBox(); ((System.ComponentModel.ISupportInitialize)(this.axMaskEdBox1)). BeginInit(); // // axMaskEdBox1 // this.axMaskEdBox1.Location = new System.Drawing.Point(16, 12); this.axMaskEdBox1.Name = "axMaskEdBox1"; this.axMaskEdBox1.OcxState = ((System.Windows.Forms.AxHost.State) 603 Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý (resources.GetObject("axMaskEdBox1.OcxState"))); this.axMaskEdBox1.Size = new System.Drawing.Size(112, 20); this.axMaskEdBox1.TabIndex = 0; this.Controls.Add(this.axMaskEdBox1); Chú ý rằng, các thuộc tính tùy biến của điều kiểm ActiveX không được áp dụng trực tiếp thông qua các lệnh thiết lập thuộc tính. Thay vào đó, chúng sẽ được thiết lập theo nhóm khi thuộc tính OcxState đã được thiết lập. Tuy nhiên, mã lệnh của bạn có thể sử dụng các thuộc tính này một cách trực tiếp. 10. 10. T o thành ph n .NET dùng cho COM-clientạ ầ T o thành ph n .NET dùng cho COM-clientạ ầ   Bạn cần tạo một thành phần . NET sao cho một COM- client có thể gọi nó.   Tạo một assembly theo các chỉ dẫn trong mục này. Tạo một thư viện kiểu cho assembly này bằng tiện ích dòng lệnh Type Library Exporter ( Tlbexp.exe ). .NET Framework hỗ trợ việc COM-client sử dụng thành phần .NET. Khi COM-client tạo một đối tượng .NET, CLR sẽ tạo một đối tượng được-quản-lý và một COM Callable Wrapper (CCW) bọc lấy đối tượng này. COM-client sẽ tương tác với đối tượng thông qua CCW. CLR chỉ tạo một CCW cho một đối tượng được-quản-lý, bất chấp có bao nhiêu COM-client đang sử dụng nó. Các kiểu cần được truy xuất bởi COM-client phải thỏa mãn các yêu cầu sau: • Các kiểu được-quản-lý (lớp, giao diện, cấu trúc, hoặc kiểu liệt kê) phải được khai báo là public . • Nếu COM-client cần tạo đối tượng, nó phải có một phương thức khởi dựng mặc định public . COM không hỗ trợ các phương thức khởi dựng có chứa thông số. • Các thành viên của kiểu cần được truy xuất phải là các thành viên public . COM-client không truy xuất được các thành viên private , protected , internal , và static . Ngoài ra, bạn nên tuân theo các kinh nghiệm sau: • Không nên tạo các quan hệ thừa kế giữa các lớp, vì các quan hệ này sẽ không khả kiến đối với COM-client (mặc dù .NET giả lập quan hệ này bằng cách khai báo một giao diện lớp cơ sở dùng chung). • Các lớp mà bạn trưng ra nên hiện thực một giao diện. Với mục đích kiểm soát phiên bản, bạn có thể sử dụng đặc tính System.Runtime.InteropServices.GuidAttribute để chỉ định GUID sẽ được gán cho giao diện. • Nên tạo tên mạnh cho assembly để nó có thể được cài đặt vào GAC và được dùng chung cho nhiều client. Để tạo một đối tượng .NET, COM-client cần một thư viện kiểu (file .tlb). File thư viện kiểu có thể được tạo từ một assembly bằng tiện ích dòng lệnh Tlbexp.exe. Ví dụ: tlbexp ManagedLibrary.dll 604 Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý Một khi đã tạo ra thư viện kiểu, bạn có thể tham chiếu nó từ một công cụ phát triển không- được-quản-lý. Với Visual Basic 6, bạn tham chiếu file .tlb từ hộp thoại Project | Reference. Trong Visual C++ 6, bạn có thể sử dụng lệnh #import để nhập các định nghĩa kiểu từ thư viện kiểu. 16 605 Chương 16:CÁC GIAO DIỆN VÀ MẪU THÔNG DỤNG 606 607 Chương 16: Các giao diện và mẫu thông dụng hương này trình bày cách hiện thực các mẫu (pattern) sẽ được sử dụng thường xuyên trong quá trình phát triển các ứng dụng Microsoft .NET Framework. Một số mẫu được chuẩn hóa bằng các giao diện được định nghĩa trong thư viện lớp .NET Framework. Một số khác thì ít cứng nhắc hơn, nhưng vẫn yêu cầu bạn thực hiện các cách tiếp cận cụ thể để thiết kế và hiện thực các kiểu của bạn. Các mục trong chương này mô tả cách: C  Tạo các kiểu khả-tuần-tự-hóa để bạn có thể dễ dàng lưu trữ vào đĩa, gửi qua mạng, hoặc truyển bằng trị qua các biên miền ứng dụng (mục 16.1).  Cung cấp một cơ chế dùng để tạo bản sao đầy đủ và chính xác của đối tượng (mục 16.2).  Hiện thực các kiểu sao cho dễ dàng so sánh và sắp xếp (mục 16.3).  Hỗ trợ việc liệt kê các phần tử trong các tập hợp tùy biến (mục 16.4).  Bảo đảm rằng một kiểu có sử dụng các tài nguyên không-được-quản-lý sẽ giải phóng các tài nguyên đó khi không còn cần đến chúng nữa (mục 16.5).  Hiển thị dạng chuỗi của các đối tượng biến đổi dựa trên format specifier (mục 16.6).  Hiện thực các kiểu đối số sự kiện và ngoại lệ tùy biến (bạn sẽ thường xuyên sử dụng chúng trong quá trình phát triển ứng dụng) (mục 16.7 và 16.8).  Hiện thực các mẫu thiết kế thông dụng Singleton và Observer bằng các tính năng có sẵn của C# và thư viện lớp .NET Framework (mục 16.9 và 16.10). 1. 1. Hi n th c ki u kh -tu n-t -hóa (serializable type)ệ ự ể ả ầ ự Hi n th c ki u kh -tu n-t -hóa (serializable type)ệ ự ể ả ầ ự   Bạn cần hiện thực một kiểu tùy biến khả-tuần-tự-hóa, cho phép bạn: • Lưu trữ các thể hiện của kiểu vào kho lưu trữ (file hay cơ sở dữ liệu). • Chuyển các thể hiện của kiểu qua mạng. • Truyền các thể hiện của kiểu “bằng trị” qua các biên miền ứng dụng.   Đối với việc tuần tự hóa các kiểu đơn giản, hãy áp dụng đặc tính System.SerializableAttribute vào khai báo kiểu. Đối với các kiểu phức tạp hơn, hoặc để kiểm soát nội dung và cấu trúc của dữ liệu được-tuần-tự-hóa, hãy hiện thực giao diện System.Runtime.Serialization.ISerializable . Mục 2.12 đã trình bày cách tuần tự hóa và giải tuần tự hóa một đối tượng bằng các lớp formatter (được cấp cùng với thư viện lớp .NET Framework). Tuy nhiên, theo mặc định thì các kiểu không là khả-tuần-tự-hóa. Để hiện thực một kiểu tùy biến là khả-tuần-tự-hóa, bạn phải áp dụng đặc tính SerializableAttribute vào khai báo kiểu. Khi tất cả các trường dữ liệu trong kiểu đều là khả-tuần-tự-hóa, việc áp dụng SerializableAttribute là tất cả những gì cần làm để khiến cho kiểu tùy biến của bạn là khả-tuần-tự-hóa. Nếu bạn hiện thực một lớp tùy biến dẫn xuất từ một lớp cơ sở, lớp cơ sở cũng phải là khả-tuần-tự-hóa. Mỗi lớp formatter chứa logic cần thiết để tuần tự hóa các kiểu được gắn với đặc tính SerializableAttribute và sẽ tuần tự hóa tất cả các trường public , protected , và private . 608 Chương 16: Các giao diện và mẫu thông dụng Đoạn mã dưới đây trình bày các khai báo kiểu và khai báo trường của một lớp khả-tuần-tự- hóa có tên là Employee . using System; [Serializable] public class Employee { private string name; private int age; private string address; § }  Các lớp dẫn xuất từ một kiểu khả-tuần-tự-hóa không thừa kế đặc tính SerializableAttribute . Để khiến cho các kiểu dẫn xuất là khả-tuần-tự-hóa, bạn phải khai báo chúng là khả-tuần-tự-hóa bằng cách áp dụng đặc tính SerializableAttribute . Bạn có thể ngăn việc tuần tự hóa một trường nào đó bằng cách áp dụng đặc tính System.NonSerializedAttribute cho trường này. Bạn nên ngăn việc tuần tự hóa đối với các trường sau: • Chứa các kiểu dữ liệu không-khả-tuần-tự-hóa. • Chứa các giá trị có thể không hợp lệ khi đối tượng được giải tuần tự hóa, ví dụ: kết nối cơ sở dữ liệu, địa chỉ bộ nhớ, ID của tiểu trình, và handle của tài nguyên không-được- quản-lý. • Chứa các thông tin nhạy cảm hay riêng tư, ví dụ: mật khẩu, khóa mật hóa, và các chi tiết riêng về người hay tổ chức. • Chứa các dữ liệu dễ dàng tái tạo hay thu lấy được từ các nguồn khác—đặc biệt khi dữ liệu lớn. Nếu ngăn việc tuần tự hóa một số trường, bạn phải hiện thực kiểu sao cho bù lại việc những dữ liệu nào đó sẽ không hiện diện khi một đối tượng được giải tuần tự hóa. Đáng tiếc, bạn không thể tạo hay thu lấy các trường dữ liệu bị mất trong một phương thức khởi dựng vì formatter không gọi phương thức khởi dựng trong quá trình giải tuần tự hóa đối tượng. Giải pháp thông thường nhất là hiện thực mẫu “Lazy Initialization”, trong đó kiểu của bạn sẽ tạo hay thu lấy dữ liệu ngay lần đầu tiên cần đến. Đoạn mã dưới đây trình bày một phiên bản đã được chỉnh sửa của lớp Employee với đặc tính NonSerializedAttribute được áp dụng cho trường address , nghĩa là formatter sẽ không tuần tự hóa giá trị của trường này. Lớp Employee hiện thực các thuộc tính công khai dùng để truy xuất các thành viên dữ liệu riêng, là nơi thuận tiện để hiện thực “Lazy Initialization” cho trường address . 609 Chương 16: Các giao diện và mẫu thông dụng using System; [Serializable] public class Employee { private string name; private int age; [NonSerialized] private string address; // Phương thức khởi dựng đơn giản. public Employee(string name, int age, string address) { this.name = name; this.age = age; this.address = address; } // Thuộc tính công khai dùng để truy xuất tên của nhân viên. public string Name { get { return name; } set { name = value; } } // Thuộc tính công khai dùng để truy xuất tuổi của nhân viên. public int Age { get { return age; } set { age = value; } } // Thuộc tính công khai dùng để truy xuất địa chỉ của nhân viên. // Sử dụng "Lazy Initialization" để thiết lập địa chỉ vì // đối tượng được-giải-tuần-tự-hóa sẽ không có giá trị địa chỉ. public string Address { get { if (address == null) { 610 Chương 16: Các giao diện và mẫu thông dụng // Nạp địa chỉ từ kho lưu trữ. } return address; } set { address = value; } } } Đối với phần lớn các kiểu tùy biến, việc sử dụng đặc tính SerializableAttribute và NonSerializedAttribute sẽ đáp ứng đủ nhu cầu tuần tự hóa của bạn. Nếu cần kiểm soát quá trình tuần tự hóa, bạn cần hiện thực giao diện ISerializable . Các lớp formatter sử dụng logic khác nhau khi tuần tự hóa và giải tuần tự hóa thể hiện của các kiểu có hiện thực ISerializable . Để hiện thực đúng ISerializable , bạn phải: • Khai báo rằng kiểu của bạn có hiện thực giao diện ISerializable . • Áp dụng đặc tính SerializableAttribute vào khai báo kiểu như vừa được mô tả; không sử dụng NonSerializedAttribute vì nó sẽ không có tác dụng. • Hiện thực phương thức ISerializable.GetObjectData (được sử dụng trong quá trình tuần tự hóa), phương thức này nhận các kiểu đối số sau: ▪ System.Runtime.Serialization.SerializationInfo ▪ System.Runtime.Serialization.StreamingContext • Hiện thực một phương thức khởi dựng không công khai (được sử dụng trong quá trình giải tuần tự hóa), phương thức này nhận cùng đối số như phương thức GetObjectData . Nhớ rằng, nếu bạn có ý định dẫn xuất một số lớp từ lớp khả-tuần-tự-hóa thì phương thức khởi dựng này phải là protected . • Nếu bạn tạo một lớp khả-tuần-tự-hóa từ một lớp cơ sở cũng có hiện thực ISerializable , thì phương thức GetObjectData và phương thức khởi dựng (dùng để giải tuần tự hóa) của bạn phải gọi các phương thức tương đương trong lớp cha. Trong quá trình tuần tự hóa, formatter sẽ gọi phương thức GetObjectData và truyền cho nó các tham chiếu SerializationInfo và StreamingContext . • Bạn phải đổ dữ liệu cần tuần tự hóa vào đối tượng SerializationInfo . Lớp SerializationInfo cung cấp phương thức AddValue dùng để thêm dữ liệu. Với mỗi lần gọi AddValue , bạn phải chỉ định tên dữ liệu (tên này sẽ được sử dụng trong quá trình giải tuần tự hóa để thu lấy dữ liệu). Phương thức AddValue có đến 16 phiên bản nạp chồng, cho phép bạn thêm nhiều kiểu dữ liệu khác nhau vào đối tượng SerializationInfo . . nên tuân theo các kinh nghiệm sau: • Không nên tạo các quan hệ thừa kế giữa các lớp, vì các quan hệ này sẽ không khả kiến đối với COM-client (mặc dù .NET giả lập quan hệ này bằng cách khai báo. để nhập các định nghĩa kiểu từ thư viện kiểu. 16 605 Chương 16:CÁC GIAO DIỆN VÀ MẪU THÔNG DỤNG 606 607 Chương 16: Các giao diện và mẫu thông dụng hương này trình bày cách hiện thực các mẫu (pattern). nhắc hơn, nhưng vẫn yêu cầu bạn thực hiện các cách tiếp cận cụ thể để thiết kế và hiện thực các kiểu của bạn. Các mục trong chương này mô tả cách: C  Tạo các kiểu khả-tuần-tự-hóa để bạn có thể

Ngày đăng: 08/07/2014, 17:20

Mục lục

    CẤU TRÚC CỦA SÁCH

    YÊU CẦU VỀ HỆ THỐNG

    CÁCH SỬ DỤNG ĐĨA CD

    Chương 1:PHÁT TRIỂN ỨNG DỤNG

    1. Tạo ứng dụng Console

    2. Tạo ứng dụng dựa-trên-Windows

    3. Tạo và sử dụng module

    4. Tạo và sử dụng thư viện

    5. Truy xuất các đối số dòng lệnh

    6. Chọn biên dịch một khối mã vào file thực thi

Tài liệu cùng người dùng

Tài liệu liên quan