Ai là C# expert cho hỏi cách truyền nhiều tham số cho method

Nguyễn Minh Trung
(Nguyen Minh Trung)

New Member
Hi mọi người, ai là chuyên gia C# cho mình hỏi chút, mình đang gặp vấn đề với phần parameter arrays của C# như thế này.

1. Mình tạo 1 class "Nút" như sau (viết tiếng Việt cho dễ):

Class A
{
string name;
double voltage;
double power;
}

2. Tạo một mảng gồm nhiều các phần tử thuộc loại "A" trên: A[] a = new A[10]

3. Tạo 1 mảng b như sau: int[] b = new int[10]

4. Mình cần tạo 1 function có 2 tham số đầu vào là a và b ở trên, đầu ra là b (đã được tính lại) và 1 số interger number.

Trong Matlab thì đơn giản, chỉ cần tạo 1 hàm như sau:

[b, number] = solve_system(a,b)

Nhưng trong C# khi đọc đến parameter arrays của method trong class nó ghi là: "There can be only one parameter aray in a parameter list". Như vậy việc truyền 2 tham số a, b là mảng (không cùng kiểu) như trên là không được :|. Ai có kinh nghiệm về vấn đề này và có thể cho giải pháp được không? Mình học C# theo kiểu học mót mới có 1 tháng gần đây, trước toàn pascal với matlab quen rồi, giờ ko biết xoay sở ra sao mà thời gian thì gấp. Xin cảm ơn mọi góp ý :D.
 
Hic tưởng giờ người người C#, nhà nhà C#, hỏi cái sẽ có người reply luôn :|.
Vấn đề đã được giải quyết, sử dụng static field và static method trong 1 class.
 
Vấn đề đã được giải quyết, sử dụng static field và static method trong 1 class.
Giải quyết kỳ cục vậy :|

Mình cần tạo 1 function có 2 tham số đầu vào là a và b ở trên, đầu ra là b (đã được tính lại) và 1 số interger number
public void blahblahblabh(A[] a,int[] b)
 
Nhưng mà tham số với tham trị ở trong C# thì khai báo thế nào ý nhỉ? Lâu rồi ko dùng lại C# nên quên sạch sẽ :-<

Vấn đề đã được giải quyết, sử dụng static field và static method trong 1 class.
Cái này không hiểu :-?? có lẽ là ko hiểu được vấn đề anh Trung đưa ra :-??
 
Ko dám nhận là expert nhưng cũng dùng C#, có điều đọc bài của bạn Trung tớ chả hiểu bạn đang hỏi gì nên chả dám ti toe :">
 
Nhưng mà tham số với tham trị ở trong C# thì khai báo thế nào ý nhỉ? Lâu rồi ko dùng lại C# nên quên sạch sẽ

Tham số với tham trị là gì ạ :"> . Có phải parameter ko? Cũng giống như C++ thôi, cứ tên type rồi tên parameter
 
Ko dám nhận là expert nhưng cũng dùng C#, có điều đọc bài của bạn Trung tớ chả hiểu bạn đang hỏi gì nên chả dám ti toe :">
He he, tớ có đặc điểm là nói gì người khác không hiểu :(

Ý tớ là thế này: Tớ muốn tạo 1 function mà đầu vào là 2 tham số, đầu ra là 2 tham số khác chẳng hạn. Vấn đề 2 tham số đầu vào này không cùng loại, 1 thằng là mảng số phức, 1 thằng là mảng các phần tử user-defined object. Theo tớ đọc trong sách, nó viết về mục array parameter thì nó ghi là "There can be only one parameter aray in a parameter list" (Quyển Illustrated C# 2005 của Appres). Đọc đến đấy thì tớ nghĩ là việc mình vứt vào 2 tham số array trên là không được nên phải đem đi hỏi mọi người.

PS: Thực ra chỗ này mình cũng hơi ngu, đáng ra phải thử xem sách viết có đúng hay không trước khi đi hỏi, căn bản đang làm gấp quá nên cuống hết cả lên. 1 tuần code ngày đêm vẫn chưa xong :(. Anyway, tks mọi người đã ngó vô topic :D.

À còn cái giải pháp mình viết ở trên bắt nguồn từ việc static field (or member ?) và static method có thể truy cập được từ ngoài class chứa nó.

Giả sử mình tạo 1 class là A, bên trong có static field là field1, field2, có 1 static method là function1 chẳng hạn. Và từ 1 class B khác, mình sẽ set được giá trị cho field1 và field2 (thông qua A.field1 và A.field2), và gọi được function1 thông qua A.function1. Nói thế có dễ hiểu không nhỉ :D.
 
Chỉnh sửa lần cuối:
Tham số với tham trị là gì ạ
Tham số là các biến tham gia vào hàm, sau khi xử lý xong trong hàm, đi ra vẫn không bị thay đổi giá trị.

Tham trị là các biến tham gia vào hàm, nếu như bị thay đổi bên trong nội dung của hàm, đi ra sẽ thay đổi giá trị.

Chẳng hạn:

A là tham số
B là tham trị

Có hàm F (A, B) {
A++;
B++;
....
}

sau khi xử lý hàm này, giá trị A sẽ ko thay đổi, còn giá trị của B sẽ tăng thêm 1. Đấy là điểm khác biệt giữa tham số và tham trị. Cái này trong pascal thì thêm chữ Var vào trước tên biến, nhưng ko biết C# có hay không, và áp dụng thế nào.
 
He he, tớ có đặc điểm là nói gì người khác không hiểu :(

Ý tớ là thế này: Tớ muốn tạo 1 function mà đầu vào là 2 tham số, đầu ra là 2 tham số khác chẳng hạn. Vấn đề 2 tham số đầu vào này không cùng loại, 1 thằng là mảng số phức, 1 thằng là mảng các phần tử user-defined object. Theo tớ đọc trong sách, nó viết về mục array parameter thì nó ghi là "There can be only one parameter aray in a parameter list" (Quyển Illustrated C# 2005 của Appres). Đọc đến đấy thì tớ nghĩ là việc mình vứt vào 2 tham số array trên là không được nên phải đem đi hỏi mọi người.

PS: Thực ra chỗ này mình cũng hơi ngu, đáng ra phải thử xem sách viết có đúng hay không trước khi đi hỏi, căn bản đang làm gấp quá nên cuống hết cả lên. 1 tuần code ngày đêm vẫn chưa xong :(. Anyway, tks mọi người đã ngó vô topic :D.

À còn cái giải pháp mình viết ở trên bắt nguồn từ việc static field (or member ?) và static method có thể truy cập được từ ngoài class chứa nó.

Giả sử mình tạo 1 class là A, bên trong có static field là field1, field2, có 1 static method là function1 chẳng hạn. Và từ 1 class B khác, mình sẽ set được giá trị cho field1 và field2 (thông qua A.field1 và A.field2), và gọi được function1 thông qua A.function1. Nói thế có dễ hiểu không nhỉ :D.

Cái này hình như hơi bị bad design thì phải. Nếu cần thay đổi các field của A thì nên đặt hẳn trong 1 method của A, chứ ai lại để class B nghịch lung tung các biến của class A như vậy nhỉ? Giả về sau có 10 cái class, cái nào cũng có code để thay đổi field 1, field 2 của A, vả giả sử 1 đoạn code trong đó có bug, thì mình lại phải dò lại tất cả 10 class để tìm bug? Thay vào đó, nên để class A tự handle các field của mình, như thể chỉ cần tìm bug ở class A thôi.

Đấy là common sense thì anh thấy như thế, còn anh kô biết C#.

Không rõ từ static trong C# nghĩa là gì, nhưng thường nó có nghĩa là 1 static method thì không cần dùng đến cái object pointer. Mình có thể dùng 1 static method của class A mà không cần tạo một object của class đó.
 
Em vẫn ko hiểu đc anh Trung muốn gì ạ :D Mặc dù đã cố gắng đọc hiểu, nhưng vì em đang bị ốm, và cũng thực sự không hiểu đc (có thể do não em máu lên não hơi chậm), nên em ko giúp gì được. Nếu như theo cách mà anh Dũng nói, thì em nghĩ tại sao lại phải làm thế trong khi mình có thể đưa phương thức trực tiếp vào trong Class và tác động đến chính biến ở trong Class? Như thế thì không phải truyền tham số cho phương thức nữa. Mình chỉ truyền vào các tham số không có trong class hoặc là do người dùng tự thiết lập. Em thấy, nếu là các biến cần dùng lâu dài, mình nên thiết kế sẵn ở trong class. Như thế cũng giảm được lượng tham số cần truyền, nhất là trong trường hợp dùng các hàm đệ quy.
 
Cái này hình như hơi bị bad design thì phải. Nếu cần thay đổi các field của A thì nên đặt hẳn trong 1 method của A, chứ ai lại để class B nghịch lung tung các biến của class A như vậy nhỉ? Giả về sau có 10 cái class, cái nào cũng có code để thay đổi field 1, field 2 của A, vả giả sử 1 đoạn code trong đó có bug, thì mình lại phải dò lại tất cả 10 class để tìm bug? Thay vào đó, nên để class A tự handle các field của mình, như thể chỉ cần tìm bug ở class A thôi.

Đấy là common sense thì anh thấy như thế, còn anh kô biết C#.

Không rõ từ static trong C# nghĩa là gì, nhưng thường nó có nghĩa là 1 static method thì không cần dùng đến cái object pointer. Mình có thể dùng 1 static method của class A mà không cần tạo một object của class đó.
Tại em coi class A như 1 cái function nên việc class B thay đổi các giá trị bên trong A cũng giống như là việc truyền tham số đầu vào cho A thôi. Anyway, nó thực sự là bad design, cái này thì giờ em công nhận rồi.

Em vẫn ko hiểu đc anh Trung muốn gì ạ :D Mặc dù đã cố gắng đọc hiểu, nhưng vì em đang bị ốm, và cũng thực sự không hiểu đc (có thể do não em máu lên não hơi chậm), nên em ko giúp gì được. Nếu như theo cách mà anh Dũng nói, thì em nghĩ tại sao lại phải làm thế trong khi mình có thể đưa phương thức trực tiếp vào trong Class và tác động đến chính biến ở trong Class? Như thế thì không phải truyền tham số cho phương thức nữa. Mình chỉ truyền vào các tham số không có trong class hoặc là do người dùng tự thiết lập. Em thấy, nếu là các biến cần dùng lâu dài, mình nên thiết kế sẵn ở trong class. Như thế cũng giảm được lượng tham số cần truyền, nhất là trong trường hợp dùng các hàm đệ quy.

He, hơi lạ là anh viết lại mà em vẫn không hiểu :p. Nhưng mà cái này stop được rồi vì hôm nay anh đã thử truyền nhiều tham số cho method ở dạng mảng, thấy ... được :-w. Nói chung là anh đọc sách không hiểu kỹ, mà cũng ko chịu test. Tks mọi người nhiều ạ :D.
 
Trong C# tham trị là ref nhưng giá trị của biến có bị thay đổi không lại phụ thuộc vào kiểu biến. (nếu là reference type thì nó sẽ thay đổi giá trị biến (bản chất là chuyền object pointer vào) còn value type thì không thay đổi giá trị biến).
Còn cái array parameter thì hình như khai báo bằng từ khóa params đúng không? cái đấy đúng là trong parameters list chỉ để được phép có 1 cái và nếu ko nhầm thì nó phải đứng ở cuối.
 
Chỉnh sửa lần cuối:
Back
Bên trên