• .NET Framework là môi trường tích hợp để đơn giản
hóa việc phát triển và thực thi cá cứng dụng trên
Internet, desktop và các thiết bị di động .
• Các mục tiêu chính:
•Cung cấp một môi trường hướng đối tượng nhất quán
cho nhiều loại ứng dụng
•Cung cấp một môi trường giảm tối thiểu sự xung đột
phiên bản.
372 trang |
Chia sẻ: lylyngoc | Lượt xem: 1657 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Bài giảng C và ứng dụng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nội dung học
• Tổng quan về .net FrameWork
• Ngôn ngữ lập trình C#
• Ngôn ngữ lập trình hướng đối tượng với
C#
• Xử lý dữ liệu với ADO.NET
• Xây dựng ứng dụng Web
CHƯƠNG I
Giới thiệu
• .NET Framework là môi trường tích hợp để đơn giản
hóa việc phát triển và thực thi các ứng dụng trên
Internet, desktop và các thiết bị di động .
• Các mục tiêu chính:
• Cung cấp một môi trường hướng đối tượng nhất quán
cho nhiều loại ứng dụng
• Cung cấp một môi trường giảm tối thiểu sự xung đột
phiên bản.
• Cung cấp một môi trường linh động, dựa trên các
chuẩn đã được chứng nhận để có thể chứa trên bất
cứ hệ điều hành nào.
Kiến trúc của .NET Framework
Kiến trúc của .NET Framework
•CLR (Common Language Runtime): Quản lý sự
thực thi mã lệnh và tất cả các tác vụ liên quan đến
nó: biên dịch, quản lý bộ nhớ, bảo mật, quản lý
tuyến đoạn.
Mã lệnh thực thi trong CLR chia làm 2 loại:
- mã được quản lý
- mã không được quản lý là mã lệnh không cài đặt
những yêu cầu để thực thi trong CLR – chẳng hạn
như COM hoặc các thành phần dựa trên Windows
API.
Kiến trúc của .NET Framework
•FCL(Framework Class Library ) là thư viện
kiểu dữ liệu có thể tái sử dụng (gồm các
class, structure, …) dành cho các ứng dụng
thực thi trong .NET.
•Tất cả các ngôn ngữ hỗ trợ .NET
Framework đều sử dụng thư viện lớp dùng
chung này.
Các bước thực hiện của Ct
truyền thống
Source
Code
Compiler
Executable
Code
Code
Executed
R
U
N
T
I
M
E
Các bước thực hiện của Ct
truyền thống
• Các ngôn ngữ trước đây có chương
trình dịch riêng và có môi trường chạy
riêng của nó.
• Trong .NET, chương trình dịch dịch mã
nguồn vào một "Intermediate Language
(IL)“ và runtime được thay thế bởi CLR
(Common Language Runtime).
Các bước thực hiện của các ct .NET
1st Compliation
2nd Compliation
.NET
Source
Code
Language
Compiler
MSIL
+
Metadata
CLR Machinecode
Code
executed
Các chương trình .NET được dịch 2 lần: lần đầu chậm, lần thứ 2 tương
đối nhanh hơn.
Các bước thực hiện của các ct .NET
• Chương trình nguồn trước hết sẽ được biên
dịch và đóng gói thành một khối gọi là assembly
(là tập hợp các thành phần được đóng gói trong
file exe hoặc dll). Khối này sẽ chứa các mã lệnh
ngôn ngữ trung gian (IL) và các metadata mô tả
thông tin cần thiết cho sự hoạt động của khối.
• Mỗi khi có yêu cầu thực thi assembly nói trên,
CLR sẽ dùng trình biên dịch JIT (Just-in-Time)
của môi trường thực thi để chuyển đối IL chứa
trong nó sang dạng mã lệnh cụ thể của máy khi
ứng dụng thực sự thực thi.
Các bước thực hiện của các ct .NET
Các kiểu dữ liệu cơ sở của CTS
Nội dung
• Giới thiệu
• Môi trượng soạn thảo và chạy
• Biến và các kiểu dữ liệu
• Các cấu trúc điều khiển: if, switch
• Các cấu trúc lặp; for, while, do while,
foreach
• Mảng, ArrayList, File văn bản.
• Bài thực hành
GIỚI THIỆU VỀ C#
• Là NNLT đơn giản, hiện đại, an toàn và
hướng đối tượng
• Là ngôn ngữ mạnh nhất trong .NET
• Thay thế cho C++
• Có cú pháp giống C++, Java
• Sử dụng con trỏ dễ dàng hơn trong C++
GIỚI THIỆU VỀ C#
- “bài toán” cần giải quyết là một solution.
- Một solution bao gồm một hoặc nhiều
project.
- Một solution, nếu có nhiều project thì nên
được tạo ra trong một thư mục riêng để có
thể chứa các project trong nó.
Cú pháp đơn giản của 1 Project
•Using các Namespace
[Namespace Ten]
{
- Tập hợp các lớp
}
Trong các lớp phải có lớp chứa hàm main,
chương trình luôn bắt đầu từ hàm main
public static void Main(string[] args)
{
}
Dịch và chạy 1 chương trình C# trên Console
• Soạn mã: Người sử dụng có thể dùng bất kỳ
trình soạn thảo nào như:
– Notepad
– Microsoft Visual Studio
– ….
• Lưu lại thành file có phần mở rộng .cs
• Start|Programs|Microsoft .NET Framework SDK
v2.0|SDK Command Prompt
– Gõ csc [ổ đĩa:]\[ đường dẫn]\ cần dịch
– Gõ tên file cần chạy
• Chú ý: file csc.exe định vị ở:
– "C:\Program Files\Microsoft Visual Studio 8\ SDK\
v2.0\“ đối với 2005
– C:\WINNT\Microsoft.NET\Framework\v1.1.4322 đối
với 2003
Ví dụ chương trình đơn giản
using System;
class Test
{
public static void Main()
{
string varStr;
varStr = “A simple program";
Console.WriteLine(varStr);
}
}
Sử dụng IDE Microsoft Visual Studio 2005
• Khởi động Microsoft Visual Studio 2005. File Æ
New Æ Project để tạo mới một project
Biến
• Khai báo theo cú pháp:
Mức truy cập Kiểu Tên biến
public
protected
private
int
string
...
Các kiểu số nguyên
Tên Kiểu trong
CTS
Mô tả Vùng biểu diễn
(min:max)
sbyte System.SByte Số nguyên có dấu 8-bit -27:27-1
short System.Int16 Số nguyên có dấu 16-bit -215:215-1
int System.Int32 Số nguyên có dấu 32-bit -231:231-1
long System.Int64 Số nguyên có dấu 64-bit -263:263-1
byte System.Byte Số nguyên không dấu 8-bit 0:28-1
ushort System.UInt16 Số nguyên không dấu 16-bit 0:216-1
uint System.UInt32 Số nguyên không dấu 32-bit 0:232-1
ulong System.UInt64 Số nguyên không dấu 64-bit 0:264-1
Kiểu số thực, Boolean, ký tự
• Kiểu số thực: float, double
• Kiểu Boolean: bool: true|false
• Kiểu ký tự: char
– Biểu diễn 1 ký tự 16-bit (Unicode) Các hằng
kiểu ký tự được gán bằng cách đóng trong
cặp dấu nháy đơn, ví dụ 'A'.
Kiễu dữ liệu tham chiếu
được định nghĩa sẵn
Tên Kiểu CTS Mô tả
object System.Object Kiểu dữ liệu gốc, mọi kiểu dữ liệu khác
trong CTS đều kế thừa từ đây (kể cả
các kiểu dữ liệu giá trị)
string System.String Chuỗi ký tự Unicode
Ví dụ
class Program
{
static void Main(string[] args)
{
object t;
t = (object) 5;
string[] st = new string[2] { "ab","cd" };
object[] t1;
t1 = st;
Console.Write(t1[1].ToString());
Console.ReadLine();
}
}
Các phương thức trên chuỗi
using System;
class ThaoTacTrenString
{static void Main(string[] args)
{ string st1=" Nguyen Anh Trung ";
string st2 = "le Tien Tang";
st1 = st1.Trim();
Console.Write("Chieu dai chuoi la {0}:\n", st1.Length);
Console.WriteLine("Ky tu tai chi so thu 3 la {0}", st1[3]);
string ten1=st1.Substring(st1.LastIndexOf(' ')+1);
string ten2 = st2.Substring(st2.LastIndexOf(" ")+1,
st2.Length - st2.LastIndexOf(" ")-1);
Console.WriteLine("Ten2=ten1:{0}",ten2.Equals(ten1));
Console.WriteLine("so sanh ten1 voi ten 2: {0}",
ten1.CompareTo(ten2));
Console.ReadLine();
}
}
Các phương thức trên chuỗi
using System;
class ThaoTacTrenString
{
static void Main(string[] args)
{ string st1="Nguyen Anh Trung ";
Console.WriteLine("Tim chuoi con {0}", st1.Contains("yen"));
st1=st1.Replace("Nguyen", "Le");
Console.WriteLine(st1);
st1=st1.Remove(0, 3);
Console.WriteLine(st1);
st1 = "Le nam|tink26-dhkh";
char[] ts = new char[2] { '|', '-' };
string[] ds = st1.Split(ts);
Console.WriteLine("ten:{0},lop:{1},truong{2}", ds[0], ds[1], ds[2]);
}
} ….
Các toán tử
Loại toán tử Ký hiệu
Số học + - * / %
Logic && || !
Cộng chuỗi +
Tăng và giảm ++ --
Dịch bit >
So sánh == != =
Phép gán = += -= *= /= %= &= |= ^= >=
Truy xuất thành phần .
Indexing (cho array và các indexers) []
Ép kiểu ()
Điều kiện ?:
Tạo đối tượng new
Thông tin về kiểu Sizeof(Kiểu)
Điều khiển Overflow exception checked unchecked
Luồng điều khiển của chương trình
• Các câu lệnh rẻ nhánh
– if
– switch
• Các câu lệnh lặp
– for
– while
– do
– foreach
Câu lệnh if
using System;
class Test
{
public static void Main()
{
int i = 10;
if (i<10)
{
Console.WriteLine("less than 10");
}
else
{
Console.WriteLine("greater or equal to 10");
}
}
}
Câu lệnh Switch
...
int i = 2;
switch (i)
{
case 1:
Console.WriteLine("one");
break;
case 2:
Console.WriteLine("two");
break;
default:
Console.WriteLine("another value");
break;
}
...
Câu lệnh For [1]
using System;
class Test
{
public static void Main()
{
int s = 0;
for (int i=1; i<=10; i++)
{
s+=i;
}
Console.WriteLine(s);
}
}
Câu lệnh For [2]
Phạm vi của biến đếm: chỉ có tác dụng
trong vòng lặp.
using System;//Ví dụ lỗi
class Test
{
public static void Main()
{
int s = 0;
for (int i=1; i<=10; i++)
{
s+=i;
}
Console.WriteLine(i); //Error statement
Console.WriteLine(s);
}
}
Câu lệnh while
using System;
class Test
{
public static void Main()
{
int i = 1;
int s = 0;
while (i<=10)
{
s += i;
i++;
}
Console.WriteLine(s);
}
}
Câu lệnh do
class Test
{
public static void Main()
{
int i = 1;
int s = 0;
do
{
s += i;
i++;
} while (i<=10);
Console.WriteLine(s);
}
}
Lệnh break có thể dùng trong các câu lệnh lặp
Câu lệnh Foreach
using System;
class Test
{
public static void Main()
{
int[] a = new int[3];
a[0] = 10;
a[1] = 20;
a[2] = 30;
foreach (int b in a)
{
Console.WriteLine(b);
}
}
}
Kiểu mảng [1]
• Khai báo:
- Mảng 1 chiều
type[] identifier
– Mảng nhiều chiều
type[,] identifier
– Mảng jagged:
type[][] identifier
Mảng1 chiều [2]
using System;
public class Test
{
public static void Main()
{
string[] students = new string[3];
students[0] = “Hung";
students[1] = “Lan";
students[2] = “Nga";
for (int i=0; i<3; i++)
{
Console.WriteLine(students[i]);
}
}
}
Mảng jagged [3]
using System;
public class Test
{
public static void Main()
{
int[][] a = new int[5][];
for (int i=0; i<a.Length; i++)
{
a[i] = new int[i+1];
for (int j=0; j<i+1; j++)
{
a[i][j] = j;
}
}
Mảng jagged [4]
for (int i=0;i<a.Length;i++)
{
for (int j=0;j<a[i].Length;j++)
{
Console.Write("{0}",a[i][j]);
}
Console.WriteLine();
}
}
}
Kiểu mảng [5]
• Có thể khởi tạo các giá trị cho mảng bằng
cách dùng {}.
• Nếu không khởi tạo C# sẽ lấy giá trị ngầm
định, phụ thuộc váo kiểu dữ liệu của mảng
– Số: 0
– Bool: False
– Ngày: 01/01/0001
– Chuỗi: “”
– …
Khởi tạo mảng 1 chiều [6]
using System;
public class Test
{
public static void Main()
{
int[] a = new int[5] {1,2,3,4,5};
foreach (int i in a)
{
Console.WriteLine(i);
}
Khởi tạo mảng 2 chiều [7]
int[,] b = new int[2,3] {{1,2,3},{4,5,6}};
foreach (int i in b)
{
Console.WriteLine(i);
}
Khởi tạo mảng jagged [8]
//jagged array
int[][] c = new int[2][]
{new int[2] {0,1},new int[3] {2,3,4}};
for (int i=0; i<c.Length; i++)
for (int j=0; j<c[i].Length; j++)
{
Console.WriteLine(c[i][j]);
}
}
}
ArrayList
• Là mảng động, mỗi phần tử là một object
• Namespace: System.Collections
• Khai báo:
ArrayList = new ArrayList();
ArrayList = new ArrayList(Số phần
tử);
Các phương thức trên ArrayList
• Add(object): Chèn thêm 1 phần tử vào cuối
mảng
• Clear(): Xoá tất cả các phần tử
• Contains(object): Tìm object trong mảng
• IndexOf(object): Tìm chỉ số của object trong
mảng (-1)
• RemoveAt(index): Xoá phần tử thứ index
• Thuộc tính: count: cho biết số phần tử trong
mảng
• …
Ví dụ ArrayList
class ThaoTacTrenArrayList
{
class test
{
public int t = 15;
}
static void Main(string[] args)
{
ArrayList a = new ArrayList();
a.Add("main");a.Add('m');a.Add(5);a.Add(DateTime.Now);
test t = new test(); a.Add(t);
for(int i=0;i<a.Count;i++)
if (a[i] is test)
{ test tt =(test) a[i];
Console.WriteLine (tt.t);
}
else
Console.WriteLine(" {0} ", a[i].ToString());
}
Thao tác trên File
• Namespace: System.IO;
• Các đối tượng thao tác trên File: Stream,
StreamReader, StreamWriter, FileStream.
• Thao tác trên file văn bản: StreamReader,
StreamWriter.
• Mở file văn bản để đọc:
StreamReader = new StreamReader(“dd"[,Encoding]);
• Mở file văn bản để ghi:
StreamWriter = new StreamWriter (“dd“[, bool
append][,Encoding])
Các phương thức trên StreamReader
• Close(): đóng file
• Peek(): Trả về ký tự tiếp theo, -1;:EOF
• Read(): Đọc ký tự tiếp theo
• ReadBlock(…): Đọc dãy các byte
• ReadLine(): Đọc 1 dòng
• ReadToEnd(): Đọc hết file
• …
Các phương thức trên StreamWriter
• Close(): đóng file
• Write
• WriteLine: ghi file
static void Main(string[] args)
{
StreamWriter f = new
StreamWriter("d:\\tt.txt",true,Encoding.Unicode);
f.WriteLine("cộng");
f.Write("abc");
f.Close();
Console.ReadLine();
}
Ví dụ StreamReader
using System;
using System.IO;
class Program
{ static void Main(string[] args)
{
StreamReader f = new StreamReader("d:\\data.txt");
string ht;
//while ((ht = f.ReadLine()) != null)
while(f.Peek()>=0)
{
ht = f.ReadLine();
Console.WriteLine(ht);
}// Console.WriteLine(f.ReadToEnd() );
f.Close();
}
}
Bài tập thực hành
• Thực hành các bài 1,2,3,4,5 trong giáo trình.
• Giải pt bằng Gaussian:
– Vào ma trận hệ số A, vector B
– Giải thuật để chuyển ma trận về tam giác trên:
for(i = 0; i < n-1; i++)/* Trừ hàng đầu tiên */
for(j = i+1; j < n; j++){
m = a[j][i]/a[i][i];
for(k = i; k < n; k++)
a[j][k] = a[j][k] – a[i][k]*m;
b[j] = b[j] – b[i] * m;
}
- In ra nghiệm của hệ
Bài tập thực hành về ArrrayList
• Nhập vào danh sách họ tên và đtb của 1 lớp, số lượng
sv không hạn chế, quá trình nhập dừng khi nhập họ tên
rỗng:
0 1 2 3 4 5
Ht1 đtb1 Ht2 dtb2 … …
• Hiển thị họ tên và Đtb của các sinh viên lên lớp
•Nhập vào 1 họ tên, tìm xem có sv nào có họ tên này
hay không
•Tính Trung bình cộng của ĐTB
•Xoá các sinh viên có đtb ra khỏi mảng
Bài tập thực hành về File
• Làm lại bài thực hành trên nhưng lấy dữ liệu từ
file vào mảng
• Cú pháp của file chứa dữ liệu như sau:
Họ tên sv1 |đtb sv1
Họ tên sv2|dtb sv2
….
Nội dung
• Lớp đối tượng
– Hàm dựng
– Hàm huỷ
– Trường
– Phương thức
Lớp đối tượng
Mứctruycập class :
{ - Hàm dựng (Constructors)
– Hàm huỷ (Destructors)
– Hằng (Constants)
– Trường (Fields)
– Phương thức (Methods)
– Thuộc tính (Properties)
– Chỉ mục (Indexers)
– Sự kiện (Events)
– Con trỏ hàm (Delegates)
– Lớp con (Classes)
– Giao diện (Interfaces)
– Cấu trúc (Structs)
}
Mức truy cập
Mức truy cập Mô tả
public Biến hoặc phương thức có thể được truy xuất từ bất cứ
nơi nào
internal Biến hoặc phương thức chỉ có thể truy xuất trong phạm
vi cùng assembly
protected Biến hoặc phương thức chỉ có thể truy xuất từ bên
trong kiểu dữ liệu mà nó thuộc về, hoặc các kiểu dữ
liệu dẫn xuất
protected
internal
Biến hoặc phương thức có thể được truy xuất trong
phạm vi assembly hiện tại, hoặc từ các kiểu dữ liệu
dẫn xuất từ kiểu dữ liệu chứa nó
private Biến hoặc phương thức chỉ có thể được truy xuất từ
bên trong kiểu dữ liệu mà nó thuộc về
Ví dụ
public class Class_b
{
private class Class_b1
{ }
public class Class_b2
{ }
}
class Program
{ static void Main(string[] args)
{
Class_b t2 = new Class_b();
Class_b.Class_b1 t21 = new Class_b.Class_b1();
Class_b.Class_b2 t22= new Class_b.Class_b2();
}
}
Hàm dựng (Constructors)
• Là một loại đặc biệt của phương thức trong một lớp
• Được gọi khi một lớp được tạo.
• Thường được sử dụng để khởi tạo các giá trị trong
một lớp.
• Tên trùng với tên lớp
• Không trả về giá trị
• Nếu không tạo ra hàm dựng C# sẽ tạo ra hàm dựng
ngầm định
• Một lớp có thể có nhiều hàm dựng nhưng khác
nhau về số lượng hoặc kiểu của tham số
Ví dụ về Constructors
using System;
public class Person
{
string Ten,dc=“Khong co”;
public Person(string Ten)
{
this.Ten = Ten;
}
public Person(string Ten,string dc)
{
this.Ten = Ten;
this.dc = dc;
}
public void SayName()
{
Console.WriteLine(“Ht: {0} Dc {1}",Ten,dc);
}
}
Ví dụ về Constructors
class Program
{
static void Main(string[] args)
{
Person p1 = new Person("Cu Do");
p1.SayName();
Person p2 = new Person("Nguyen Ha","Ngu Tay");
p2.SayName();
}
}
Private Constructors
• Được sử dụng khi một lớp chỉ có các thành viên tĩnh và lớp không cần phải tạo
ra.
public class MathConstant
{
private MathConstant()
{
}
public static double Pi=3.14;
}
public class Test
{
public static void Main()
{
//MathConstant m = new MathConstant();
Console.WriteLine(MathConstant.Pi);
}
}
Static Constructors
• Được gọi tự động (chỉ 1 lần) trước khi thực
thể đầu tiên của đối tượng được tạo hoặc
các thành viên tĩnh được tham chiếu.
• Không có tham số
public class Bus
{
static Bus() // Static constructor:
{ System.Console.WriteLine("Ham tinh duoc goi"); }
public static void Drive()
{ System.Console.WriteLine("Phuong thuc Drive duoc goi"); }
}
class TestBus
{ static void Main()
{ Bus.Drive();
Bus b = new Bus();
Bus c= new Bus(); }
}
Destructor
• Destructors trong C# gọi là bộ thu gom rác
Garbage Collectors.
• Bộ thu gom rác sẽ giải phóng bộ nhớ khi
đối tượng không còn yêu cầu hoặc tham
chiếu.
• Destructors khai báo như sau:
~()//giống tên lớp
{
//các cài đặt của người lập trình
}
Các trường (Fields)
• Lưu trữ giá trị
• Cú pháp:
• Mức truy cập: public, private, protected,
internal, protected internal
• Kiểu:
– Kiểu giá trị được định nghĩa sẳn (int,char …)
– Kiểu tham chiếu: lớp, struct, mảng, chuỗi,….
Ví dụ
namespace Vidu
{
class Class_Lop{ }
class SinhVien
{ public string hoten;
private bool GioiTinh;
protected DateTime NgaySinh;
internal float[] DsDiem = new
float[100];
Class_Lop Lop= new
Class_Lop();
}
class Program
{
static void Main(string[] args)
{
SinhVien sv =new SinhVien();
sv.hoten = "Nguyen Nam";
//sv.GioiTinh = false;
//sv.NgaySinh =
DateTime.Parse("12/10/79");
sv.DsDiem[0] = 5;
}
}}
Trường tĩnh [1]
• Được khai báo trong 1 lớp
• Khi sử dụng không cần phải tạo ra lớp chứa
trường tĩnh
• Khi khai báo chỉ cần dùng static trước tên
biến
• Truy xuất: .tên trường tĩnh
Ví dụ trường tĩnh
using System;
public class List
{
public static int Dem = 0;
public List()//Hàm dựng: được gọi khi tạo lớp
{
Dem ++;
}
}
class Test
{
public static void Main()
{
Console.WriteLine(List.Dem );
List n1 = new List();
Console.WriteLine(List.Dem);
List n2 = new List();
Console.WriteLine(List.Dem);
}
}
Trường chỉ đọc
• Sử dụng readonly khi khai báo
• Chỉ có thể gán giá trị khi khai báo hoặc trong hàm dựng
class test
{
public readonly int a = 10;
public readonly int b;
public test()
{ b = 12; }
}
class TestBus
{ static void Main()
{
test t = new test();
//t.a++;
Console.WriteLine("a= {0}b= {1}",t.a,t.b);
}}
Constants
• Khai báo hàm dùng bổ từ const.
• Không thể thay đổi giá trị của hằng.
• Hằng sử dụng như trường tĩnh.
Ví dụ về Constants
using System;
public class Gender
{
public const int male = 1;
public const int female = 2;
}
class Test
{
public static void Main()
{
Console.WriteLine("male = {0}",Gender.male);
Console.WriteLine("female = {1}",Gender.female);
}
}
Phương thức(method)
• Là tập hợp các câu lệnh
• Được khai báo trong lớp hoặc cấu trúc,
phải chỉ rõ mức truy cập, tên, kiểu trả
về,danh sách các tham số. Nếu không có
tham số phải có cặp dấu ngoặc
• Phương thức không trả về giá trị có kiểu
trả về là void
• Dùng return để trả về giá trị của phương
thức
Ví dụ về methods
using System;
public class Person
{
string name;
public Person(string name)
{
this.name = name;
}
public void SayName()
{
Console.WriteLine("My name is {0}",name);
}
}
Tham chiếu ref and out [1]
using System;
public class Point
{
int x;
int y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
public void GetPoint(int x,int y)
{
x = this.x;
y = this.y;
}
}
Tham chiếu ref and out [2]
class Test
{
public static void Main()
{
int x = 0; //int x; --> Error
int y = 0; //int y; --> Error
Point p = new Point(100,200);
p.GetPoint(x,y);
Console.WriteLine("({0},{1})",x,y);
}
}
Output:
(0,0)
Tham chiếu ref and out [3]
using System;
public class Point
{
int x;
int y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
public void GetPoint(ref int x,ref int y)
{
x = this.x;
y = this.y;
}
}
Tham chiếu ref and out [4]
class Test
{
public static void Main()
{
int x = 0; // int x; --> Error
int y = 0; // int y; --> Error
Point p = new Point(100,200);
p.GetPoint(ref x,ref y);
Console.WriteLine("({0},{1})",x,y);
}
} Output:
(100,200)
- phải khởi tạo giá trị cho các tham số
-Khi xây dựng và gọi phương thức phải dùng ref
Tham chiếu ref and out [5]
using System;
public class Point
{
int x;
int y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
public void GetPoint(out in