2014-05-16 7 views
6

Ich habe die folgende abstrakte Basisklasse:C# params auf Methodensignatur nicht bricht eine Überschreibung/Implementierung

public abstract class HashBase 
{ 
    public abstract byte[] Hash(byte[] value); 
} 

Und dann gehe ich voran und implementieren diese Klasse:

public class CRC32Hash : HashBase 
{ 
    public override byte[] Hash(params byte[] value) 
    { 
     return SomeRandomHashCalculator.Hash(value); 
    } 
} 

Compile. ..und es funktioniert!

  1. Wird dies empfohlen oder führt dies zu "bösen" Code?
  2. Ist "params" Art von syntaktischem Zucker?
+6

* "Ist" params "Art von syntaktischem Zucker?" * Yep! Wenn Sie ein Array übergeben, wird dieses Array verwendet. Wenn Sie einige Dinge übergeben, die Elemente eines Arrays sein könnten, werden diese zu einem Array. Also ist es kompatibel; Ich weiß nicht, ob es ratsam ist. – Ryan

Antwort

1

Sie können einen Blick auf C# Spezifikation nehmen §7.5.3 (Überlastung)

Kurz gesagt, ich glaube, Schlüsselwort override verwendet wird, um eine Implementierung, nicht die Parameter neu zu definieren. Sie können Args nicht überschreiben, die Argumente müssen die gleiche Abstraktion sein (ich denke hier über die Liskov Substitutionsprinzip Anwendung).

Params ist völlig ein syntaktischer Zucker, es ist streng äquivalent zu einem einfachen Array. In bestimmten Fällen ist es einfacher zu callen, um Array-Casting zu vermeiden. Compiler erledigt die Arbeit für Sie während des Methodenaufrufs.

Beachten Sie, dass in C# 6 params mit IEnumerable kompatibel ist.