Proxy (डेटारेटर/स्मार्ट-पॉइंटर्स के समान सी ++) के साथ डेटा तक पहुंचने पर विचार करें। दुर्भाग्यवश, सिंटैक्स सी ++ के रूप में उतना साफ नहीं है जितना ऑपरेटर() ओवरलोड और ऑपरेटर के लिए उपलब्ध नहीं है [] एकल-तर्क है, लेकिन अभी भी बंद है।
बेशक, इस अतिरिक्त स्तर का अमूर्तता जटिलता और स्वयं का काम जोड़ती है, लेकिन यह आपको मौजूदा कोड में न्यूनतम परिवर्तन करने की अनुमति देगी जो डबल [,] ऑब्जेक्ट्स का उपयोग करती है, जबकि आप एक डबल का उपयोग करने की अनुमति देते हैं [ ] इंटरऑप और आपके इन-सी # गणना दोनों के लिए सरणी।
class Matrix3
{
// referece-to-element object
public struct Matrix3Elem{
private Matrix3Impl impl;
private uint dim0, dim1, dim2;
// other constructors
Matrix3Elem(Matrix3Impl impl_, uint dim0_, uint dim1_, uint dim2_) {
impl = impl_; dim0 = dim0_; dim1 = dim1_; dim2 = dim2_;
}
public double Value{
get { return impl.GetAt(dim0,dim1,dim2); }
set { impl.SetAt(dim0, dim1, dim2, value); }
}
}
// implementation object
internal class Matrix3Impl
{
private double[] data;
uint dsize0, dsize1, dsize2; // dimension sizes
// .. Resize()
public double GetAt(uint dim0, uint dim1, uint dim2) {
// .. check bounds
return data[ (dim2 * dsize1 + dim1) * dsize0 + dim0 ];
}
public void SetAt(uint dim0, uint dim1, uint dim2, double value) {
// .. check bounds
data[ (dim2 * dsize1 + dim1) * dsize0 + dim0 ] = value;
}
}
private Matrix3Impl impl;
public Matrix3Elem Elem(uint dim0, uint dim1, uint dim2){
return new Matrix2Elem(dim0, dim1, dim2);
}
// .. Resize
// .. GetLength0(), GetLength1(), GetLength1()
}
और फिर इस प्रकार का उपयोग कर दोनों पढ़ना और लिखना - 'foo [1,2,3]' अब 'के रूप में foo.Elem (1,2,3) .Value', दोनों में लिखा है असाइनमेंट और मूल्य अभिव्यक्ति के बाईं तरफ मूल्यों और लेखन मूल्यों को पढ़ना।
void normalize(Matrix3 m){
double s = 0;
for (i = 0; i < input.GetLength0; i++)
for (j = 0; j < input.GetLength(1); j++)
for (k = 0; k < input.GetLength(2); k++)
{
s += m.Elem(i,j,k).Value;
}
for (i = 0; i < input.GetLength0; i++)
for (j = 0; j < input.GetLength(1); j++)
for (k = 0; k < input.GetLength(2); k++)
{
m.Elem(i,j,k).Value /= s;
}
}
फिर, विकास की लागत, लेकिन शेयरों डेटा जोड़ा, ओवरहेड को कॉपी और नकल संबंधित developtment लागत को हटाने। यह एक व्यापार है।
यह काम नहीं करेगा। सचमुच डबल [] सरणी रखने के लिए ** ** ** की आवश्यकता होगी। यदि कुछ भी हो, तो आप एक .NET क्लास बनाना चाहते हैं जिसने डबल [] अधिनियम को डबल की तरह बनाया [,,]। –
मैं COM पुस्तकालय को बदलने में सक्षम नहीं हूं। – Hallgrim