在C#中获取和设置(私有)属性,而不使用getter setter魔术方法重载

Hen*_*zia 6 php getter setter properties getter-setter

摘要

代码示例:

Class People {
    // private property.
    private $name;

    // other methods not shown for simplicity.
}
Run Code Online (Sandbox Code Playgroud)

直接前进.我假设这$name是一个PRIVATE类成员(或属性,变量,字段,根据需要调用它).有没有办法在PHP中执行这些操作:

$someone = new People();
$someone->name = $value;
$somevar = $someone->name;
Run Code Online (Sandbox Code Playgroud)

没有使用__get($name)__set($name, $value).


背景

我需要检查分配的$value,因此我只需要一个这样的getter setter:

getName();
setName($value);
Run Code Online (Sandbox Code Playgroud)

不是必然一个getter的setter魔术方法重载是这样的:

__get($value); 
__set($value, $name);
Run Code Online (Sandbox Code Playgroud)

也就是说,我只需要一个吸气剂装置.但那不是我想要的.它只是感觉不像面向对象,因为来自静态类型语言(如C++或C#)的人可能会感觉和我一样.

有没有办法在不使用getter setter魔术方法重载的情况下在C#中获取和设置私有属性?


更新

为什么不是魔法?

  1. 网络上有传言说魔术方法比明确的getter setter方法快10倍,我还没有测试过,但要记住这是一件好事.(想象它不是那么慢,只慢2倍,见下面的基准测试结果)

  2. 如果我使用魔术方法而不是将它们分成不同的函数,我必须在一个巨大的方法中填充所有内容,就像在显式getter setter中一样.(此要求可能已由ircmaxell回答)

绩效高管基准测试

我很好奇使用魔术方法和显式getter setter之间的性能开销,因此我为这两种方法创建了自己的基准测试,希望它对任何人都有用.

使用magic方法和method_exist:

(点击这里查看代码)

  • 吸气成本为0.0004730224609375秒.
  • 二传手的成本为0.00014305114746094秒.

使用显式getter setter:

(点击这里查看代码)

  • 吸气成本为0.00020718574523926秒.
  • Setter成本为7.9870223999023E-5秒(即0.00007xxx).

也就是说,使用魔术方法和方法的setter和getter只需要比显式getter setter成本高2倍.我认为将它用于中小型系统仍然可以接受.

irc*_*ell 7

不.

但是这有什么错用__get,并__set充当动态代理,以getName()setName($val)分别?就像是:

public function __get($name) { 
    if (method_exists($this, 'get'.$name)) { 
        $method = 'get' . $name; 
        return $this->$method(); 
    } else { 
        throw new OutOfBoundsException('Member is not gettable');
    }
}
Run Code Online (Sandbox Code Playgroud)

这样你就不会把所有东西都塞进一个怪物方法中,但是你仍然可以使用$foo->bar = 'baz';私有/受保护成员变量的语法......