Tôi đang làm việc trên một thư viện toán học đơn giản cho các mục đích giáo dục và tôi đã triển khai struct
đại diện cho Rational Number. Rất mã cơ bản cho thấy các lĩnh vực cốt lõi của cấu trúc là:Giá trị mặc định cho Rational Number struct
public struct RationalNumber
{
private readonly long numerator;
private readonly long denominator;
private bool isDefinitelyCoprime;
private static RationalNumber zero = 0;
public RationalNumber(long numerator, long denominator)
{
this.numerator = numerator;
this.denominator = denominator;
this.isDefinitelyCoprime = false;
}
...
}
Hiện nay tôi đang thực hiện một RationalMatrix
đó, như bạn đã có thể đoán, sẽ được tạo thành từ RationalNumber
gõ yếu tố.
Ma trận hữu ích mà tôi đang tạo một trình tạo tĩnh cho là ma trận danh tính. Mã là như sau:
public static RationalMatrix GetIdentityMatrix(int dimension)
{
RationalNumber[,] values = new RationalNumber[dimension, dimension];
for (int i = 0; i < dimension; i++)
values[i, i] = 1;
return new RationalMatrix(values);
}
Vấn đề là điều này sẽ không làm việc vì các giá trị mặc định của RationalNumber
tôi không phải là 0/1
nhưng 0/0
mà là một loại đặc biệt của giá trị (Indeterminate form).
Rõ ràng một giải pháp rất đơn giản và nó chỉ đơn giản là thay đổi phương pháp để:
public static RationalMatrix GetIdentityMatrix(int dimension)
{
RationalNumber[,] values = new RationalNumber[dimension, dimension];
for (int i = 0; i < dimension; i++)
for (int j = i+1 ; j < dimension; j++)
{
values[i, i] = 1;
values[i, j] = RationalNumber.Zero;
values[j, i] = RationalNumber.Zero;
}
return new RationalMatrix(values);
}
Nhưng điều này dường như bằng cách nào đó một sự lãng phí công sức như tôi về cơ bản khởi tạo các giá trị của toàn bộ mảng hai lần. Tôi nghĩ rằng nó sẽ thanh lịch hơn bằng cách nào đó làm cho giá trị mặc định là RationalNumber
bằng 0/1
. Điều này sẽ dễ dàng thực hiện nếu RationalNumber là class
, nhưng tôi không thể nghĩ ra cách để thực hiện khi đó là struct
. Tôi có thiếu điều gì đó hiển nhiên hay không có cách nào để tránh có giá trị mặc định của tôi là 0/0
?
Tôi muốn chỉ ra rằng tôi không quan tâm chút nào về hiệu suất mã (nếu đây là nút cổ chai của tôi thì tôi đã vượt quá mục tiêu của tôi). Tôi chỉ tò mò muốn biết nếu có một số cấu trúc (không biết đến tôi) cho phép bạn áp đặt các giá trị mặc định tùy ý trong một struct
.
EDIT: Typos
EDIT 2: Mở rộng phạm vi của câu hỏi
OK, có vẻ như không có cách nào để áp đặt giá trị mặc định tùy ý trong một struct
từ đầu vào tôi nhận được và từ kết luận của riêng tôi dựa trên kiến thức C# giới hạn của tôi.
Ai đó có thể cho tôi manh mối về lý do tại sao cấu trúc phải hoạt động theo cách này? Có phải vì một lý do hoặc nó được thực hiện theo cách này bởi vì không ai nghĩ rằng để xác định các tùy chọn để xác định giá trị mặc định?
Khá ghê tởm, nhưng bạn có thể thay đổi 'mẫu số' thành' mẫu sốMinusOne'! Vì vậy, khi 'denominatorMinusOne == 0' có nghĩa là' mẫu số == 1'. Tôi thấy khó để đề xuất điều này như một ý tưởng hay! –
@DavidHeffernan Có lẽ không phải 'mẫu sốMinusOne' vì nó ngụ ý một phạm vi khác, nhưng có thể là' denominatorXorOne'? Thậm chí nếu nó không phải là một ý tưởng hay, nó có thể là ý tưởng _only_ hoạt động! – Rawling
Bạn có thể thêm một cái gì đó như 'bool riêng isInitialized;' và sử dụng tài sản đó một cách sáng tạo trong các phương pháp của bạn. – Arvo