【问题标题】:Setting read-only property from a method从方法设置只读属性
【发布时间】:2013-05-14 16:31:52
【问题描述】:

我有一个简单的问题,但我还是新手。

我的SetGrade 方法接受一个浮点参数,我希望它返回一个字符 然后将该值设置为 Grade 属性。

我没有正确地做某事。

public Class Student {
    private char grade;

    public char Grade { get { return grade; } }

    public char SetGrade(float score) {
        char Mgrade;
        if(score >= 90.0) {
            return Mgrade = 'A';
        }
        return Mgrade = 'F';
     }
}

【问题讨论】:

  • Mgrade 是什么,您为什么要分配给它?为什么你的Grade 属性在访问修饰符中有一个大写P? (C# 区分大小写。)
  • 您真的只想返回AF - 还是想返回“A”、“B”、“C”、“D”、“E”或“ F" 取决于 grade?

标签: c# class methods


【解决方案1】:

这段代码有很多问题,但它们可能不是你想象的那样。

首先,Public 是错误的; C# 需要public

其次,使用本地Mgrade 是奇怪且不必要的,但有趣的是,实际上并没有错误;像这样一步完成分配和返回是合法的。但在这种情况下,您不需要;只是 return 'A'; 没有本地分配。

第三,该方法命名错误,因为它没有设置Grade属性。如果您打算设置等级,那么它应该是无效的返回:

public void SetGrade(float score)
{
   if(score >= 90.0)
   {
      this.grade = 'A';
   }
   this.grade = 'F';
} 

如果该方法旨在从浮点数转换为字符,那么它应该是静态的:

public static char ScoreToGrade(float score)
{
   if(score >= 90.0)
   {
      return 'A';
   }
   return 'F';
} 

坦率地说,我倾向于两者都做:

public void SetGrade(float score)
{
  this.grade = ScoreToGrade(score);
} 

好了,现在你已经两全其美了。

第四,这只是一个风格点;你可以考虑:

  public char Grade { get; private set; }

编译器将为您生成一个“不可见”的支持字段,因此您不必自己管理它。这种语法意味着Grade 可以从任何地方读取,也可以从此类中写入。

【讨论】:

  • 啊,我明白了!我确实打算分配 Grade 属性。谢谢埃里克!
【解决方案2】:

无需将您的角色分配给中间char 变量。只需像这样返回正确的字符。

public char SetGrade(float score)
{
   if(score >= 90.0)
   {
      return 'A';
   }
   return 'F';
}

【讨论】:

  • 整个函数的内容甚至可以简化为return score >= 90.0 ? 'A' : 'F';
  • @DavidS.:给出的代码可能是真实代码的简化版本。
  • @EricLippert 绝对是,我只是喜欢指出这样的事情,因为我阅读了很多不必要的长代码:)
  • 谢谢大家。我的问题是如何将方法返回值分配给 Grade 属性,因为它是只读的。
【解决方案3】:

你的语法有点不对:

  public char SetGrade(float score)
  {
     if(score >= 90.0)
     {
       return 'A';
     }
     return 'F';
  }

不需要Mgrade 变量,您应该简单地返回所需的字符,而不是赋值并返回。

【讨论】:

  • @taras.roshko - 如果你的意思是你可以使用条件运算符,当然。
  • 是的,但实际上我同意 Eric 的观点,即代码中还有很多其他问题,包括奇怪的命名(或 SetGrade 方法中缺少道具分配)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
相关资源
最近更新 更多