除了明确清晰,我们为什么要坚持:
car.getSpeed()和car.setSpeed(55)
当这可以作为很好:
car.speed()和car.speed(55)
我知道get()和set()对于通过将所有内容保存在一个地方来保持对数据成员的任何更改都是有用的.
另外,显然,我理解car.speed()并且car.speed(55)是相同的功能,这使得这个错误,但是在PHP和Zend Framework中,相同的操作用于GET,POST和回发.
在VB和C#有"属性",和许多被使用,多少我听说纯粹主义者的厌恶,并有东西在类似于Ruby,5.times和.each,.to_i等
你有操作符重载,多重继承,虚拟函数C++,某些组合可以驱使任何人坚果.
我的意思是说,有太多的范例和方法可以完成任务,似乎没有人尝试过我提到的特定组合.
至于我,我的理由是阅读代码简短而清晰.
我错了,稍微错了,这只是奇怪的,所以不使用,或者还有什么?
如果我仍然决定保持正确,我可以使用car.speed()和car.setSpeed(55).
这有什么不对(只是省略"获取")?
谢谢你的任何解释.
我正在试图找到一个很好的方法来解决这个问题.我有一个Customer类,它实现了ICustomer接口.该界面中包含许多属性:
public interface ICustomer
{
string FirstName {get; set;}
string LastName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我只希望某些类能够设置这些属性; 即项目中的那些课程.所以我考虑制作二传手internal:
public class Customer : ICustomer
{
string FirstName {get; internal set;}
string LastName {get; internal set;}
}
Run Code Online (Sandbox Code Playgroud)
我想将该setter标记为接口内部,因此不可能有人实现ICustomer,并且程序集之外的人修改这些属性.有没有办法做到这一点?
如果您有房产:
public class Fred
{
public string UserName
{
set
{
userName=value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你如何使用Rhino Mocks来检查它
fred= new Fred();
fred.UserName="Jim";
Run Code Online (Sandbox Code Playgroud)
叫做.
Expect.Call(mockFred.UserName).SetPropertyWithArgument("Jim");
Run Code Online (Sandbox Code Playgroud)
不编译.
每次我写出一个其Value内存属性值不可内联的setter时,我都会诅咒API没有标记Setter该类的事实[ContentProperty("Value")],这将允许:
<Setter Property="BitmapEffect">
<Setter.Value>
<OuterGlowBitmapEffect GlowColor="#AAC" Opacity="0.2" GlowSize="1.25" />
</Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)
......简化为:
<Setter Property="BitmapEffect">
<OuterGlowBitmapEffect GlowColor="#AAC" Opacity="0.2" GlowSize="1.25" />
</Setter>
Run Code Online (Sandbox Code Playgroud)
所以我的问题有点双重.首先,有没有一个很好的理由没有以这种方式配置API?其次,XamlReader即使我不控制WPF API ,有什么能阻止我以某种方式提供这些元数据吗?
我一直在尝试在我的应用中使用属性而不是特定的setter和getter.它们似乎更加pythonic,通常使我的代码更具可读性.
除一个问题外更具可读性:错别字.
考虑以下简单示例(注意,我的属性实际上做了一些处理,即使这里的示例只是设置或返回一个简单的变量)
class GotNoClass(object):
def __init__(self):
object.__init__(self)
self.__a = None
def __set_a(self, a):
self.__a = a
def __get_a(self):
return self.__a
paramName = property(__get_a, __set_a)
if __name__ == "__main__":
classy = GotNoClass()
classy.paramName = 100
print classy.paramName
classy.paranName = 200
print classy.paramName
#oops! Typo above! as seen by this line:
print classy.paranName
Run Code Online (Sandbox Code Playgroud)
任何仔细阅读的人都会看到输出结果是:
100
100
200
Run Code Online (Sandbox Code Playgroud)
哎呀.不应该是因为我做了一个错字 - 我写了paranName(两个n)而不是paramName.
在这个简单的例子中,这很容易调试,但在我的大项目中它一直在伤害我.因为当我意外地使用属性时,python愉快地创建了一个新变量,所以我的代码中出现了细微的错误.我发现有时难以追查的错误.更糟糕的是,我曾经两次使用相同的拼写错误(一次是我设置的,后来一次就像我一样)所以我的代码似乎工作但很久以后,当一个不同的代码分支最终试图访问这个属性(正确)我得到了错误的价值 - 但我花了好几天才意识到我的结果有点偏差.
现在我知道这是一个问题,我花了更多的时间仔细阅读我的代码,但理想情况下我会有办法自动捕捉这种情况 - 如果我只想念一个我可以引入一个错误,直到相当一段时间过去了......
所以我想知道,我应该转而选择使用优质的老牌手机和吸气剂吗?还是有一些巧妙的方法来避免这种情况?人们只是依靠自己手动捕获这些错误吗?唉,我不是一个专业的程序员,只是有人试图在工作中完成一些工作,我真的不知道解决这个问题的最佳方法.
谢谢.
PS我明白这也是Python的好处之一,我并不抱怨.只是想知道我是否会更好地使用显式设置器和getter.
每个绑定通常具有以下四个组件:绑定目标对象,目标属性,绑定源以及要使用的绑定源中的值的路径.例如,如果要将TextBox的内容绑定到Employee对象的Name属性,则目标对象是TextBox,target属性是Text属性,要使用的值是Name,源对象是员工对象.
target属性必须是依赖项属性.
上面的摘录解释了为什么以下代码有效,
<TextBox Text="{Binding EmployeeName}">
Run Code Online (Sandbox Code Playgroud)
它起作用,因为Text是一个依赖属性.到目前为止,一切都很好!
我的问题是,
如果目标属性必须是绑定工作的依赖属性,那么以下的Setter如何工作?请注意,Setter 中的Value不是依赖属性!
<Style TargetType="{x:Type TextBox}">
<Setter Property="Text" Value="{Binding EmployeeName}"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
我有一个解释.但我不确定这是否正确.让我先解释一下,然后,如果我错了,你们要纠正我.:-)
我想,既然该类型的值是对象,这意味着,它可以保存任何类型的实例.它可以包含偶数Binding类型的实例.但是,它不能参与评估(或解析)Binding表达式的过程,因为它不是依赖属性.所以Style对象只是简单地将这个Binding对象(Value保持)从Setter转移到TextBox,而不评估/解析Binding值.因此,上面的Setter变得等同于:
Text="{Binding EmployeeName}"
Run Code Online (Sandbox Code Playgroud)
从现在开始,Text是一个依赖属性,它可以解析Binding值.所以首先看来绑定的目标是Value,但实际上,Text是绑定的目标.
就像Setter是邮差一样,Value本身就是postman的Bag,Binding实例(即Value持有的)是一封信.Postman(即Setter)将字母(即绑定实例)传递给目标(即Text属性),而不打开它,即不知道Letter携带什么Message(即EmployeeName).
如果我错了,请纠正我.
我想做这样的事情:
class Foo
{
bool Property
{
get;
set
{
notifySomethingOfTheChange();
// What should I put here to set the value?
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在那里设置价值吗?或者我是否必须明确定义get并向该类添加另一个字段?
我正在寻找一种逆转func_get_args().我想知道在定义函数时如何命名参数.这样做的原因是我不想在使用通过方法作为参数传递的设置变量时重复自己:
public function myFunction($paramJohn, $paramJoe, MyObject $paramMyObject)
{
$this->paramJohn = $paramJohn;
$this->paramJoe = $paramJoe;
$this->paramMyObject = $paramMyObject;
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我可以这样做:
foreach (func_get_params() as $param)
$this->${$param} = ${$param};
}
Run Code Online (Sandbox Code Playgroud)
这是一种矫枉过正,这是一个简单的愚蠢想法,还是有更好的方法来实现这一目标?
在使用Node.js,Mongoose和MongoDB时,我发现当我执行findOne查询时,我的Mongoose模式getter和setter不会触发.
我发现一个旧线程表明版本2.x中存在getter和setter的问题,但它表示它已经解决,我使用的是最新版本的Mongoose(3.8.7).
这是我的架构的一部分
function testGetter(value) {
return value + " test";
}
/**
* Schema
*/
var schema = new Schema({
username: { type: String, required: true, unique: true, get: testGetter }
});
// I have also tried this.
schema.path('username').get(function (value, schemaType) {
return value + " test";
});
Run Code Online (Sandbox Code Playgroud)
这是我执行查询的方式
Model
.findOne(conditions, fields, options)
.populate(population)
.exec(function (error, doc) {
callback(doc, error);
});
Run Code Online (Sandbox Code Playgroud)
它使用缺少"测试"后修复的用户名值进行响应.我在这里做错了吗?任何帮助将不胜感激!
附加信息
这是找到一个的结果:
{
"username": "Radius"
}
Run Code Online (Sandbox Code Playgroud)
在应用上述两种方法之一后,这是schema.paths.username.getters的值:
[ [Function: testGetter] ]
Run Code Online (Sandbox Code Playgroud) 我有创建xaml控件的问题.我正在使用通用应用程序在VS 2015中编写新项目.我想创建网格.在这个网格中我想要一个按钮.在模型中,我指定了列(Level)和Row.这是我的代码:
<ItemsControl Grid.Row="1" ItemsSource="{Binding Path=TechnologyList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="14*"/>
<ColumnDefinition Width="14*"/>
<ColumnDefinition Width="14*"/>
<ColumnDefinition Width="14*"/>
<ColumnDefinition Width="14*"/>
<ColumnDefinition Width="14*"/>
<ColumnDefinition Width="14*"/>
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="Control">
<Setter Property="Grid.Column" Value="{Binding Level}" />
<Setter Property="Grid.Row" Value="{Binding Row}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
我遇到错误<Setter Property="Grid.Column" Value="{Binding Level}" />
错误:HRESULT的异常:0x8000FFFF(E_UNEXPECTED)在edytor中没有运行代码.怎么了?在"旧"WPF中一切都很好,但在Universal …