【问题标题】:Pass object as function parameter in c# like in javascript在 c# 中将对象作为函数参数传递,就像在 javascript 中一样
【发布时间】:2021-05-09 17:33:20
【问题描述】:

是否有可能在 c# 中传递对象,就像我在 Javascript 中以通用方式传递对象一样?如何在 c# 中实现这一点?由于所有变量都需要声明,但它们具有不同的类名。

class human {
  constructor() {
    this.name = "John";
  }
}

class cat {
  constructor() {
    this.name = "Garfield";
  }
}


 function showName(character) {
    console.log("My name is: " + character.name)
  };

var character1 = new cat();
var character2 = new human();

showName(character1)
showName(character2)

我想将 showName 设为一个函数,但 c# 需要声明类名,例如:

public void ShowName(Human human) {}
public void ShowName(Cat cat) {}

我可以像在 JS 中一样在 c# 中实现这一点的示例代码看起来如何?

【问题讨论】:

  • 我不这么认为。 C# 是高度类型提示的,您总是必须知道变量的类型。最通用的是var
  • 好吧,既然 Javascript 不以作为一种类型化语言而闻名,我认为这是不可能的。对于类型安全相关的东西,你应该检查 TypeScript。
  • 如果humancat 都是creature 的子类,您可以构建您的函数来期待creature,尽管我在C# 方面的经验不足,无法将其作为例子。
  • @Combinu:C# 中的关键字var 没有声明泛型类型或开放类型。它只是告诉编译器他应该从表达式的右侧派生类型。结果与使用具体类型完全相同。 (有dynamic 可以真正得到一个开放的类型,但出于不同的原因,这不是初学者使用的东西)

标签: javascript c# object parameters


【解决方案1】:

要在 C# 中执行此操作,您要么需要使用公共基类或接口(可能是带有 string Name {get;} 属性的 IHasName,并将参数声明为 IHasName,并声明HumanCat 都实现了IHasName),或者您可以抛开所有的理由并将参数声明为dynamic,以获得JavaScript 的感觉。请做第一个,而不是第二个!

【讨论】:

  • 如果我们提到动态,我们也可以使用反射来做到这一点。但是是的,基类/接口继承似乎是最好的选择。
  • 好的。但是我为什么要避免动态呢?
  • @Scoppex 它不是类型安全的。用它很容易引入错误。
  • @Scoppex 因为你失去了静态类型带来的类型安全性。
【解决方案2】:

您可以使用接口来实现它。接口为基于它实现的类提供抽象,您可以在方法的参数中使用接口。看这个例子:

public interface IBeings
{
    public string Name { get; set; }
}

public class Human : IBeings
{
    public string Name { get; set; }
}

public class Cat : IBeings
{
    public string Name { get; set; }
}

class Program
{
    static void ShowName(IBeings being)
    {
        Console.WriteLine($"My name is: {being.Name}");
    }

    static void Main(string[] args)
    {
        Human human1 = new Human() { Name = "John" };
        Cat cat1 = new Cat() { Name = "Kitty" };

        ShowName(human1);
        ShowName(cat1);
    }
}

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 2018-09-05
    • 1970-01-01
    • 2018-02-23
    • 2012-05-30
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多