Bai 1 Gioi thieu
Chia sẻ bởi T Son |
Ngày 24/10/2018 |
34
Chia sẻ tài liệu: bai 1 Gioi thieu thuộc Tin học 8
Nội dung tài liệu:
1
Giới thiệu C#
2
Namespaces và Assemblies
Từ khóa namespace được dùng để khai báo phạm vi của một lớp, các lớp được quản lý theo mô hình phân cấp, Do đó tránh được trường hợp trùng tên trong quá trình sử dụng.
using CauDuong.KySu;
using CNTT.KySu;
assembly là một thư viện liên kết động (DLL) được tạo ra trong quá trình biên dịch. Là một siêu dữ liệu bao gồm các tài nguyên, mã trung gian,...
3
Ví dụ
using System;
extern alias Exam2005;
extern alias Exam2004;
class Program
{
Console.Write("C#");
Exam2005.ISE.PGUI.Exam();
Exam2004.ISE.PGUI.Exam();
}
namespace ISE Exam2005.dll
{
public class PGUI
{
public void Exam() {...}
}
}
namespace ISE Exam2004.dll
{
public class PGUI
{
public void Exam()
{...}
}
}
4
Quy tắc đặt tên
Tên bắt đầu bằng một chữ cái hoặc dấu gạch chân “_”.
Có phân biệt chữ hoa, thường(Case sensitive)
(vd: letter # Letter)
Hỗ trợ ký tự Unicode (vd: int u03C0;)
Các quy ước chung khi lập trình bằng C#:
Thuộc tính, Phương thức và Lớp: Ký tự đầu tiên của mỗi từ sẽ viết HOA (vd: Length, WriteLine,...)
Các biến cục bộ, các thành phần cục bộ: bắt đầu bằng ký tự thường (vd: len)
5
Kiểu dữ liệu
Kiểu giá trị (Value Type):
struct, enumeration, numeric types (integral, floating-point, decimal), bool, ….
Chứa giá trị thật sự, thao tác gán -> copy giá trị.
Kiểu tham chiếu (Reference Type):
class, interface, delegate, object, string.
Chứa tham chiếu (địa chỉ) đến giá trị, thao tác gán ??
Void
Nullable Type
Pointer Type
6
Các kiểu nội tại (built-in)
object, bool
byte (0 to 255), sbyte (-128 to 127)
short, ushort, int, uint, long, ulong
float, double, decimal
char, string
Ví dụ:
object o = 5, o2 = `c`, o3 = "hi";
bool b1 = false, b2 = (5 < 2);
long l = 12000L; float f = 1.2F; decimal d = 1.2M
Lưu ý: C# không cho phép sử dụng biến chưa khởi gán.
7
Kiểu Nullable
Các biến kiểu tham chiếu có thể chứa giá trị null, còn các biến giá trị ???
Các biến kiểu Nullable là các biến giá trị nhưng có thể nhận giá trị null.
Khai báo bằng T? hoặc System.Nullable.
int? x = null; int y;
y = (int) x; // báo lỗi
y = x.Value; // báo lỗi
if (x.HasValue) // false
y = x.Value;
y = x.GetValueOrDefault(); // y = 0
8
Ví dụ kiểu Nullable
int? a = 10;
int? b = null;
a++; // a = 11.
a = a * 2; // a = 22.
a = a + b; // a = null.
int? i = 5;
Type t = i.GetType(); // System.Int32
if (i is int) // true
i = 7;
9
Ép kiểu Nullable
int i = 135;
int? x = i; // int --> int?
double? y = x; // int? --> double?
int? z = (int?)y; // double? --> int?
int j = (int)z; // int? --> int
int? z = x.HasValue && y.HasValue ?
x.Value + y.Value : (int?) null;
10
Phép toán ??
Giá trị của biểu thức a ?? b là
a nếu a có giá trị khác null; ngược lại là
b.
Nếu biến a thuộc kiểu nullable và biến b không thuộc kiểu nullable, biểu thức a ?? b trả về giá trị không thuộc kiểu nullable.
int? x = 5;
int? y = 7;
int? z = x ?? y;
int i = z ?? -1;
Kiểu giá trị của biểu thức x ?? y là int?, nhưng kiểu giá trị của biểu thức z ?? -1 là int.
11
Unsafe Code và Pointers
Kiểu con trỏ được định nghĩa theo cách sau
type* identifier;
void* identifier; // ok nhưng không khuyến khích
unsafe // chỉ cảnh báo khi biên dịch với lựa chọn /unsafe
{
int* p1, p2, p3; // ok
int *p1, *p2, *p3; // không cho phép trong C#
int x = 5;
int* px = &x // &: Phép toán lấy địa chỉ
int y = *px; // giá trị
string s = px->ToString(); // địa chỉ của biến x
}
12
Boxing & Unboxing
Boxing
object o1 = 5, o2 = ‘c’;
ArrayList al = new ArrayList();
al.Add(5); al.Add("hi");
Unboxing
int i = (int) o1;
char c = (char) o2;
string s = (string) al[1];
13
Từ khóa as
Sử dụng trong chuyển đổi tham chiếu và boxing
expression as type
expression is type ? (type) expression : (type) null
object oi = 5;
object os = "st";
string si = oi as string; // null
string ss = os as string; // ss = "st"
14
Từ khóa is
Kiểm tra sự tương thích kiểu, hỗ trợ cho việc ép kiểu tường minh.
object o1 = 5, o2 = `s`;
char c = 0;
c = (char) o1; // báo lỗi
if (o2 is char) // hợp lệ
c = (char) o2;
15
Từ khóa const & readonly
class MyClass {
const int x = 5;
readonly int y = 25;
const int xx;
readonly int yy; //ok
public MyClass() {
yy = 24;
}
public void MyMethod {
yy = 10; x = 7;
}
}
16
Từ khóa checked & unchecked
Dùng để kiểm soát vấn đề tràn số.
int x = 2147483647; // max int value
int x = 2147483647; // max int value
int z = unchecked(x + y);
// z = -2
int z = checked(x + y);
// báo lỗi
17
Từ khóa ref
void MyMethod()
{
int num1 = 7, num2 = 9;
Swap(ref num1, ref num2);
// num1 = 9, num2 = 7
}
void Swap(ref int x, ref int y)
{
int temp = x; x = y; y = temp;
}
18
Từ khóa out
void MyMethod()
{
int num1 = 7, num2;
Subtraction(num1, out num2);
// num1 = 7, num2 = 5
}
void Subtraction(int x, out int y)
{
y = x - 2;
}
Chưa khởi gán
19
Từ khóa params
void MyMethod()
{
int sum = Addition(1, 2, 3); // sum = 6
}
int Addition(params int[] integers)
{
int result = 0;
for (int i = 0; i < integers.Length; i++)
result += integers[i];
return result;
}
20
Lớp (Classes)
Thuộc kiểu tham chiếu, bao gồm dữ liệu và phương thức được đóng gói lại.
Lớp có thể bao gồm các thành phần sau:
Constructors and destructors
Fields and constants
Methods
Properties
Indexers
Events
Overloaded operators
Nested types (classes, structs, interfaces, enumerations and delegates)
21
Ví dụ lớp
public class MyArray
{
private const int MAX_LENGTH = 100;
private int length;
public MyArray() {
length = 0;
}
public int Length {
get {
return length;
}
set {
length = value;
}
}
}
22
Hàm khởi tạo (Constructor)
Hàm khởi tạo tự động được gọi khi đối tượng bắt đầu được tạo ra.
Tên của hàm khởi tạo phải giống với tên lớp.
Hàm khởi tạo mặc định: Nếu không có hàm khởi tạo nào được định nghĩa thì hàm khởi tạo mặc định sẽ được dùng.
Một lớp có thể khai báo nhiều hàm khởi tạo.
Hàm khởi tạo tĩnh: Giống như phương thức tĩnh và không có tham số và không dùng toán tử truy xuất (private, public).
23
Ví dụ hàm khởi tạo
public class Languages
{
static Languages() // hàm khởi tạo tĩnh
{. . .}
public Languages() // Hàm khởi tạo mặc định
{. . .}
public Languages(string lang)
{. . .}
}
public class MyClass()
{
Languages langs = new Languages();
}
24
Ví dụ về Phương thức của Lớp
public class CSharp
{
public CSharp () { . . .}
public static void StaticMethod() { . . .}
public void NonStaticMethod() { . . .}
}
public class MyClass()
{
CSharp cs = new CSharp();
cs.NonStaticMethod();
CSharp.StaticMethod();
}
25
Class Property
public class CSharp
{
private int count = 0;
. . .
public int Count {
get {
return count;
}
internal set {
count = value;
}
}
public class MyClass()
{
CSharp cs = new CSharp();
cs.Count = 5;
int num = cs.Count;
}
26
Class Indexer
public class CSharp
{
int [] vals = new int [10];
. . .
public int this [int i]
{
get
{
return vals[i];
}
}
}
public class MyClass()
{
CSharp cs = new CSharp();
int num = cs[2];
}
27
Lớp lồng nhau (Nested Class)
Lớp trong có thể truy xuất được tất cả các thành phần của lớp ngoài kể cả các thành phần private.
Lớp ngoài chỉ truy xuất được lớp trong nếu khai báo toán tử truy xuất là public.
public class MyClass
{
private class NestedClass
{
}
}
28
Mức độ truy xuất
public: Không giới hạn truy xuất
private: Truy xuất bởi các thành phần trong cùng lớp.
protected: Truy xuất bởi các thành phần trong cùng lớp hoặc lớp dẫn xuất.
internal: Truy xuất trong phạm vi cùng assembly
protected internal: protected + internal
29
Abstract Class, Abstract Methods and Virtual Methods
Lớp trừu tượng (Abstract Class) chỉ được dùng để thừa kế và không tạo được thể hiện.
Nếu lớp có ít nhất một phương thức trừu tượng thì phải được khai báo là lớp trừu tượng.
Các phương thức trừu tượng không cài đặt code, tất cả các lớp thừa kế từ lớp trừu tượng phải cài đặt lại các phương thức với từ khóa override.
Các phương thức với từ khóa Virtual đã được cài đặt trong lớp trừu tượng, do đó không bắt buộc phải cài đặt lại trong lớp dẫn xuất.
30
Ví dụ
Lớp trừu tượng:
public abstract class AbstractClass
{
public AbstractClass()
{
}
public abstract int AbstractMethod();
public virtual int VirtualMethod()
{
return 0;
}
}
31
Ví dụ
Lớp dẫn xuất:
public class DerivedClass : AbstractClass
{
public DerivedClass()
{ }
public override int AbstractMethod()
{
return 0;
}
public override int VirtualMethod()
{
return base.VirtualMethod ();
}
}
32
Lớp đóng kín (Sealed)
Từ khóa sealed được dùng nhằm ngăn cản sự thừa kế của lớp và phương thức.
Một phương thức được khai báo với từ khóa sealed sẽ không được override trong lớp dẫn xuất.
Tất cả các phương thức trong một lớp đóng kín mặc định sẽ bị đóng kín.
33
Ví dụ Lớp đóng kín
sealed class SealedClass
{
public int x;
public int y;
}
class MyClass
{
SealedClass sc = new SealedClass();
sc.x = 10;
sc.y = 20;
}
class InClass : SealedClass // báo lỗi
{ }
34
Lớp thành phần (Partial)
Cho phép code của một lớp có thể nằm trên nhiều tập tin khác nhau.
Cho phép quản lý code dễ dàng hơn.
35
Ví dụ Partial Class
public class Student
{
private int studentID;
private int name;
public Student () {
...
}
public ChangeName() {
...
}
public ChangeID () {
…
}
}
public partial class Student {
private int studentID;
public Student () {
. . .
}
}
public partial class Student {
private int name;
public ChangeName() {
. . .
}
public ChangeID () {
. . .
}
}
36
Giao tiếp (Interface)
Giống như lớp trừu tượng, nó bao gồm các phương thức chưa được cài đặt.
Khai báo một giao tiếp như sau:
public interface IStudent
{
int StudentID {get; set;}
void AddSubject(string subjectName);
}
Tất cả các lớp cài đặt giao tiếp thì phải cài đặt lại tất cả các phương thức trong giao tiếp đó.
37
Cài đặt giao tiếp
public class Student : IStudent
{
private int studentID = 0;
private ArrayList subjects = null;
public Student() {}
public int StudentID {
get { return studentID; }
set { studentID = value; }
}
public void AddSubject(string subjectName) {
subjects.Add(subjectName);
}
}
38
Lớp tổng quát
public class NonGeneric
{
object item;
public object Item
{
get {
return item;
}
set {
item = value;
}
}
}
public class Generic
{
T item;
public T Item
{
get {
return item;
}
set {
item = value;
}
}
}
public class MyClass()
{
NonGeneric ng = new NonGeneric ();
Generic g = new Generic();
}
39
Lớp tổng quát
Ưu điểm
Kiểm tra kiểu dữ liệu
Tăng khả năng dùng lại với kiểu dữ liệu khác nhau
Sử dụng
Kiểu được kiểm tra khi khai báo.
Dùng được cho cả kiểu giá trị và tham chiếu
Các lớp tập hợp (Collection classes)
Stack, Queue, Dictionary
Các giao tiếp tập hợp (Collection interfaces)
IEnumerable, ICollection, IDictionary
40
Lớp tổng quát: Ràng buộc
public class Hashtable {
public void Insert(U key, V value) {
if (key.CompareTo(x) < 0) {...} // error, no CompareTo method
}
}
public class Hashtable {
public void Insert(U key, V value) {
if (((IComparable) key).CompareTo(x) < 0) {...}
}
}
public class Hashtable where U: IComparable {
public void Insert(U key, V value) {
if (key.CompareTo(x) < 0) {...}
}
}
41
Phương thức tổng quát
(Generic Methods)
static void AddMultiple(List list, params T[] values)
{
foreach (T value in values)
list.Add(value);
}
void MyMethod()
{
List list = new List();
AddMultiple(list, 2, 4, 6);
}
Giới thiệu C#
2
Namespaces và Assemblies
Từ khóa namespace được dùng để khai báo phạm vi của một lớp, các lớp được quản lý theo mô hình phân cấp, Do đó tránh được trường hợp trùng tên trong quá trình sử dụng.
using CauDuong.KySu;
using CNTT.KySu;
assembly là một thư viện liên kết động (DLL) được tạo ra trong quá trình biên dịch. Là một siêu dữ liệu bao gồm các tài nguyên, mã trung gian,...
3
Ví dụ
using System;
extern alias Exam2005;
extern alias Exam2004;
class Program
{
Console.Write("C#");
Exam2005.ISE.PGUI.Exam();
Exam2004.ISE.PGUI.Exam();
}
namespace ISE Exam2005.dll
{
public class PGUI
{
public void Exam() {...}
}
}
namespace ISE Exam2004.dll
{
public class PGUI
{
public void Exam()
{...}
}
}
4
Quy tắc đặt tên
Tên bắt đầu bằng một chữ cái hoặc dấu gạch chân “_”.
Có phân biệt chữ hoa, thường(Case sensitive)
(vd: letter # Letter)
Hỗ trợ ký tự Unicode (vd: int u03C0;)
Các quy ước chung khi lập trình bằng C#:
Thuộc tính, Phương thức và Lớp: Ký tự đầu tiên của mỗi từ sẽ viết HOA (vd: Length, WriteLine,...)
Các biến cục bộ, các thành phần cục bộ: bắt đầu bằng ký tự thường (vd: len)
5
Kiểu dữ liệu
Kiểu giá trị (Value Type):
struct, enumeration, numeric types (integral, floating-point, decimal), bool, ….
Chứa giá trị thật sự, thao tác gán -> copy giá trị.
Kiểu tham chiếu (Reference Type):
class, interface, delegate, object, string.
Chứa tham chiếu (địa chỉ) đến giá trị, thao tác gán ??
Void
Nullable Type
Pointer Type
6
Các kiểu nội tại (built-in)
object, bool
byte (0 to 255), sbyte (-128 to 127)
short, ushort, int, uint, long, ulong
float, double, decimal
char, string
Ví dụ:
object o = 5, o2 = `c`, o3 = "hi";
bool b1 = false, b2 = (5 < 2);
long l = 12000L; float f = 1.2F; decimal d = 1.2M
Lưu ý: C# không cho phép sử dụng biến chưa khởi gán.
7
Kiểu Nullable
Các biến kiểu tham chiếu có thể chứa giá trị null, còn các biến giá trị ???
Các biến kiểu Nullable là các biến giá trị nhưng có thể nhận giá trị null.
Khai báo bằng T? hoặc System.Nullable
int? x = null; int y;
y = (int) x; // báo lỗi
y = x.Value; // báo lỗi
if (x.HasValue) // false
y = x.Value;
y = x.GetValueOrDefault(); // y = 0
8
Ví dụ kiểu Nullable
int? a = 10;
int? b = null;
a++; // a = 11.
a = a * 2; // a = 22.
a = a + b; // a = null.
int? i = 5;
Type t = i.GetType(); // System.Int32
if (i is int) // true
i = 7;
9
Ép kiểu Nullable
int i = 135;
int? x = i; // int --> int?
double? y = x; // int? --> double?
int? z = (int?)y; // double? --> int?
int j = (int)z; // int? --> int
int? z = x.HasValue && y.HasValue ?
x.Value + y.Value : (int?) null;
10
Phép toán ??
Giá trị của biểu thức a ?? b là
a nếu a có giá trị khác null; ngược lại là
b.
Nếu biến a thuộc kiểu nullable và biến b không thuộc kiểu nullable, biểu thức a ?? b trả về giá trị không thuộc kiểu nullable.
int? x = 5;
int? y = 7;
int? z = x ?? y;
int i = z ?? -1;
Kiểu giá trị của biểu thức x ?? y là int?, nhưng kiểu giá trị của biểu thức z ?? -1 là int.
11
Unsafe Code và Pointers
Kiểu con trỏ được định nghĩa theo cách sau
type* identifier;
void* identifier; // ok nhưng không khuyến khích
unsafe // chỉ cảnh báo khi biên dịch với lựa chọn /unsafe
{
int* p1, p2, p3; // ok
int *p1, *p2, *p3; // không cho phép trong C#
int x = 5;
int* px = &x // &: Phép toán lấy địa chỉ
int y = *px; // giá trị
string s = px->ToString(); // địa chỉ của biến x
}
12
Boxing & Unboxing
Boxing
object o1 = 5, o2 = ‘c’;
ArrayList al = new ArrayList();
al.Add(5); al.Add("hi");
Unboxing
int i = (int) o1;
char c = (char) o2;
string s = (string) al[1];
13
Từ khóa as
Sử dụng trong chuyển đổi tham chiếu và boxing
expression as type
expression is type ? (type) expression : (type) null
object oi = 5;
object os = "st";
string si = oi as string; // null
string ss = os as string; // ss = "st"
14
Từ khóa is
Kiểm tra sự tương thích kiểu, hỗ trợ cho việc ép kiểu tường minh.
object o1 = 5, o2 = `s`;
char c = 0;
c = (char) o1; // báo lỗi
if (o2 is char) // hợp lệ
c = (char) o2;
15
Từ khóa const & readonly
class MyClass {
const int x = 5;
readonly int y = 25;
const int xx;
readonly int yy; //ok
public MyClass() {
yy = 24;
}
public void MyMethod {
yy = 10; x = 7;
}
}
16
Từ khóa checked & unchecked
Dùng để kiểm soát vấn đề tràn số.
int x = 2147483647; // max int value
int x = 2147483647; // max int value
int z = unchecked(x + y);
// z = -2
int z = checked(x + y);
// báo lỗi
17
Từ khóa ref
void MyMethod()
{
int num1 = 7, num2 = 9;
Swap(ref num1, ref num2);
// num1 = 9, num2 = 7
}
void Swap(ref int x, ref int y)
{
int temp = x; x = y; y = temp;
}
18
Từ khóa out
void MyMethod()
{
int num1 = 7, num2;
Subtraction(num1, out num2);
// num1 = 7, num2 = 5
}
void Subtraction(int x, out int y)
{
y = x - 2;
}
Chưa khởi gán
19
Từ khóa params
void MyMethod()
{
int sum = Addition(1, 2, 3); // sum = 6
}
int Addition(params int[] integers)
{
int result = 0;
for (int i = 0; i < integers.Length; i++)
result += integers[i];
return result;
}
20
Lớp (Classes)
Thuộc kiểu tham chiếu, bao gồm dữ liệu và phương thức được đóng gói lại.
Lớp có thể bao gồm các thành phần sau:
Constructors and destructors
Fields and constants
Methods
Properties
Indexers
Events
Overloaded operators
Nested types (classes, structs, interfaces, enumerations and delegates)
21
Ví dụ lớp
public class MyArray
{
private const int MAX_LENGTH = 100;
private int length;
public MyArray() {
length = 0;
}
public int Length {
get {
return length;
}
set {
length = value;
}
}
}
22
Hàm khởi tạo (Constructor)
Hàm khởi tạo tự động được gọi khi đối tượng bắt đầu được tạo ra.
Tên của hàm khởi tạo phải giống với tên lớp.
Hàm khởi tạo mặc định: Nếu không có hàm khởi tạo nào được định nghĩa thì hàm khởi tạo mặc định sẽ được dùng.
Một lớp có thể khai báo nhiều hàm khởi tạo.
Hàm khởi tạo tĩnh: Giống như phương thức tĩnh và không có tham số và không dùng toán tử truy xuất (private, public).
23
Ví dụ hàm khởi tạo
public class Languages
{
static Languages() // hàm khởi tạo tĩnh
{. . .}
public Languages() // Hàm khởi tạo mặc định
{. . .}
public Languages(string lang)
{. . .}
}
public class MyClass()
{
Languages langs = new Languages();
}
24
Ví dụ về Phương thức của Lớp
public class CSharp
{
public CSharp () { . . .}
public static void StaticMethod() { . . .}
public void NonStaticMethod() { . . .}
}
public class MyClass()
{
CSharp cs = new CSharp();
cs.NonStaticMethod();
CSharp.StaticMethod();
}
25
Class Property
public class CSharp
{
private int count = 0;
. . .
public int Count {
get {
return count;
}
internal set {
count = value;
}
}
public class MyClass()
{
CSharp cs = new CSharp();
cs.Count = 5;
int num = cs.Count;
}
26
Class Indexer
public class CSharp
{
int [] vals = new int [10];
. . .
public int this [int i]
{
get
{
return vals[i];
}
}
}
public class MyClass()
{
CSharp cs = new CSharp();
int num = cs[2];
}
27
Lớp lồng nhau (Nested Class)
Lớp trong có thể truy xuất được tất cả các thành phần của lớp ngoài kể cả các thành phần private.
Lớp ngoài chỉ truy xuất được lớp trong nếu khai báo toán tử truy xuất là public.
public class MyClass
{
private class NestedClass
{
}
}
28
Mức độ truy xuất
public: Không giới hạn truy xuất
private: Truy xuất bởi các thành phần trong cùng lớp.
protected: Truy xuất bởi các thành phần trong cùng lớp hoặc lớp dẫn xuất.
internal: Truy xuất trong phạm vi cùng assembly
protected internal: protected + internal
29
Abstract Class, Abstract Methods and Virtual Methods
Lớp trừu tượng (Abstract Class) chỉ được dùng để thừa kế và không tạo được thể hiện.
Nếu lớp có ít nhất một phương thức trừu tượng thì phải được khai báo là lớp trừu tượng.
Các phương thức trừu tượng không cài đặt code, tất cả các lớp thừa kế từ lớp trừu tượng phải cài đặt lại các phương thức với từ khóa override.
Các phương thức với từ khóa Virtual đã được cài đặt trong lớp trừu tượng, do đó không bắt buộc phải cài đặt lại trong lớp dẫn xuất.
30
Ví dụ
Lớp trừu tượng:
public abstract class AbstractClass
{
public AbstractClass()
{
}
public abstract int AbstractMethod();
public virtual int VirtualMethod()
{
return 0;
}
}
31
Ví dụ
Lớp dẫn xuất:
public class DerivedClass : AbstractClass
{
public DerivedClass()
{ }
public override int AbstractMethod()
{
return 0;
}
public override int VirtualMethod()
{
return base.VirtualMethod ();
}
}
32
Lớp đóng kín (Sealed)
Từ khóa sealed được dùng nhằm ngăn cản sự thừa kế của lớp và phương thức.
Một phương thức được khai báo với từ khóa sealed sẽ không được override trong lớp dẫn xuất.
Tất cả các phương thức trong một lớp đóng kín mặc định sẽ bị đóng kín.
33
Ví dụ Lớp đóng kín
sealed class SealedClass
{
public int x;
public int y;
}
class MyClass
{
SealedClass sc = new SealedClass();
sc.x = 10;
sc.y = 20;
}
class InClass : SealedClass // báo lỗi
{ }
34
Lớp thành phần (Partial)
Cho phép code của một lớp có thể nằm trên nhiều tập tin khác nhau.
Cho phép quản lý code dễ dàng hơn.
35
Ví dụ Partial Class
public class Student
{
private int studentID;
private int name;
public Student () {
...
}
public ChangeName() {
...
}
public ChangeID () {
…
}
}
public partial class Student {
private int studentID;
public Student () {
. . .
}
}
public partial class Student {
private int name;
public ChangeName() {
. . .
}
public ChangeID () {
. . .
}
}
36
Giao tiếp (Interface)
Giống như lớp trừu tượng, nó bao gồm các phương thức chưa được cài đặt.
Khai báo một giao tiếp như sau:
public interface IStudent
{
int StudentID {get; set;}
void AddSubject(string subjectName);
}
Tất cả các lớp cài đặt giao tiếp thì phải cài đặt lại tất cả các phương thức trong giao tiếp đó.
37
Cài đặt giao tiếp
public class Student : IStudent
{
private int studentID = 0;
private ArrayList subjects = null;
public Student() {}
public int StudentID {
get { return studentID; }
set { studentID = value; }
}
public void AddSubject(string subjectName) {
subjects.Add(subjectName);
}
}
38
Lớp tổng quát
public class NonGeneric
{
object item;
public object Item
{
get {
return item;
}
set {
item = value;
}
}
}
public class Generic
{
T item;
public T Item
{
get {
return item;
}
set {
item = value;
}
}
}
public class MyClass()
{
NonGeneric ng = new NonGeneric ();
Generic
}
39
Lớp tổng quát
Ưu điểm
Kiểm tra kiểu dữ liệu
Tăng khả năng dùng lại với kiểu dữ liệu khác nhau
Sử dụng
Kiểu được kiểm tra khi khai báo.
Dùng được cho cả kiểu giá trị và tham chiếu
Các lớp tập hợp (Collection classes)
Stack
Các giao tiếp tập hợp (Collection interfaces)
IEnumerable
40
Lớp tổng quát: Ràng buộc
public class Hashtable {
public void Insert(U key, V value) {
if (key.CompareTo(x) < 0) {...} // error, no CompareTo method
}
}
public class Hashtable
public void Insert(U key, V value) {
if (((IComparable) key).CompareTo(x) < 0) {...}
}
}
public class Hashtable where U: IComparable {
public void Insert(U key, V value) {
if (key.CompareTo(x) < 0) {...}
}
}
41
Phương thức tổng quát
(Generic Methods)
static void AddMultiple
{
foreach (T value in values)
list.Add(value);
}
void MyMethod()
{
List
AddMultiple
}
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: T Son
Dung lượng: |
Lượt tài: 2
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)