1. Trang chủ
  2. » Công Nghệ Thông Tin

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

10 260 0
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 2,67 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. 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

Trang 1

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;

Trang 2

Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý

Console.ReadLine();

}

}

9. S d ng đi u ki m ActiveX trong NET S d ng đi u ki m ActiveX trong NET ử ụ ử ụ ề ề ể ể -client

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)

Trang 3

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

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

Trang 4

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

Trang 5

Chương 16:CÁC GIAO DIỆN VÀ MẪU THÔNG DỤNG

Trang 6

606

Trang 7

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. 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) ệ ệ ự ể ự ể ả ầ ự ả ầ ự

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).

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

Trang 8

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

Trang 9

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) {

Trang 10

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

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