簡體   English   中英

如何在C#中看到這樣的Java代碼?

[英]How would such a java code look in C#?

我正在將一個java代碼移植到C#並遇到了這段代碼。 我無法想象如何移植它,因為它似乎聲明了類數組。 我在C#中的知識太有限,無法弄清楚如何在C#中實現此操作。 在C#中是否存在與此Stub聲明等效的內容,它看起來如何? 我把它縮小到最小,因為它宣布了10個物體。 以下是代碼的外觀:

        public interface IcodecWeightFunctionStub
        {
                void hcodec_weight_func(int[] block, int block_offset, int stride, int log2_denom, int weight, int offset);
        }

        public interface IHcodecBiWeightFunctionStub
        {
                void hcodec_biweight_func(int[] dst, int dst_offset, int[] src, int src_offset, int stride, int log2_denom, int weightd, int weights, int offset);
        }


        public IHcodecWeightFunctionStub[] weight_hcodec_pixels_tab = new IHcodecWeightFunctionStub[]               {
    new IHcodecWeightFunctionStub() {
            public void hcodec_weight_func(int []block, int block_offset, int stride, int log2_denom, int weight, int offset) {
                    weight_hcodec_pixels_c(16, 16, block, block_offset, stride, log2_denom, weight, offset);
            }
    },
    new IHcodecWeightFunctionStub() {
            public void hcodec_weight_func(int []block, int block_offset, int stride, int log2_denom, int weight, int offset) {
                    weight_hcodec_pixels_c(16, 8, block, block_offset, stride, log2_denom, weight, offset);
            }
    }
};

問題不在於在C#中實例化接口,而在於在C#中返回新類。

匿名委托實現和C#的lambda是最接近Java的匿名接口實現的東西,但接口需要有一個方法。 您的接口都有一個方法,因此您的代碼可以轉換為C#,如下所示:

public delegate void HcodecWeightDelegate(int[] block, int block_offset, int stride, int log2_denom, int weight, int offset);
public delegate void HcodecBiweightDelegate(int[] dst, int dst_offset, int[] src, int src_offset, int stride, int log2_denom, int weightd, int weights, int offset);

public HcodecBiweightDelegate[] WeightHcodecPixelsTab = new HcodecBiweightDelegate[] {
    (block, block_offset, stride, log2_denom, weight, offset) => {
        weight_hcodec_pixels_c(16, 16, block, block_offset, stride, log2_denom, weight, offset);
    }
,   (block, block_offset, stride, log2_denom, weight, offset) => {
        weight_hcodec_pixels_c(16, 8, block, block_offset, stride, log2_denom, weight, offset);
    }
};

請注意,調用委托也是不同的:在Java中,您可以像這樣調用它們:

weight_hcodec_pixels_tab[i].hcodec_weight_func(block, block_offset, stride, log2_denom, weight, offset);

在C#中,您沒有方法名稱(因為委托封裝了單個方法),因此相同的調用將如下所示:

HcodecBiweightDelegate[i](block, block_offset, stride, log2_denom, weight, offset);

你的例子有點不一致 - 接口方法名稱不匹配,但希望我的數組示例和C#等價物將有所幫助。 你可以使用delegates和lambdas,但是沒有必要這樣做。 對於以下Java代碼:

public interface Foo
{
    void Bar(int i);
}

class test
{
    //array of anonymous inner classes:
    public Foo[] x = new Foo[] {
        new Foo() {
            public void Bar(int i) {
                //code 1
            }
        },
        new Foo() {
            public void Bar(int i) {
                //code 2
            }
        }
    };
}

以下C#代碼是等效的:

public interface Foo
{
    void Bar(int i);
}

class Test
{
    public Foo[] x = new Foo[] { new FooAnonymousInnerClassHelper1(), new FooAnonymousInnerClassHelper2() };

    private class FooAnonymousInnerClassHelper1 : Foo
    {
        public virtual void Bar(int i)
        {
            //code 1
        }
    }

    private class FooAnonymousInnerClassHelper2 : Foo
    {
        public virtual void Bar(int i)
        {
            //code 2
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM