创建类时,可以使用TypeDescriptor.GetConverter(typeof(T))将TypeConverter属性应用于它,返回自定义类型转换器.例如:
[TypeConverter(typeof(FooConverter))]
public class Foo
{...}
public class FooConverter: TypeConverter
{...}
var tc = TypeDescriptor.GetConverter(typeof(T)); //returns a FooConverter instance.
Run Code Online (Sandbox Code Playgroud)
只要课程是我们制作的,这就有效.但是如何为我们无法修改源代码的类提供自定义TypeConverter?例如,如何为System.Version类(没有一个)提供自定义TypeConverter?
根据C++标准:
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员.
引用的哪些属性会阻止具有引用成员的类包含在标准布局类的定义中?
这更像是一个哲学问题,但我在代码库中已经多次看到这一点,并且并不真正理解这种编程方法是如何形成的.
假设您必须将位2和3设置为某个值x而不更改uint中的其他值.这样做是非常微不足道的,也是一项常见的任务,我倾向于这样做:
uint8_t someval = 0xFF; //some random previous value
uint8_t x = 0x2; //some random value to assign.
someval = (somval & ~0xC) | (x << 2); //Set the value to 0x2 for bits 2-3
Run Code Online (Sandbox Code Playgroud)
我见过代码或使用'|' 使用'+':
uint8_t someval = 0xFF; //some random previous value
uint8_t x = 0x2; //some random value to assign.
someval = (somval & ~0xC) + (x << 2); //Set the value to 0x2 for bits 2-3
Run Code Online (Sandbox Code Playgroud)
它们是等价的吗?
是.
这个比那个好吗?
仅当您的硬件没有按位OR指令时,我才从未见过没有按位OR的处理器(即使是小型PIC10处理器也有OR指令).
那么为什么有些程序员倾向于使用'+'代替'|'?我在这里错过了一些非常明显,优秀的强大优化吗?
这是一个谜语.
想象一下,我有以下C++函数:
template<uint8_t MASK>
uint8_t Foo(uint8_t val)
{
uint8_t step = 0;
uint8_t result = 0;
if(MASK & 0x01) {result |= (val & 0x01) >> step; ++step;}
if(MASK & 0x02) {result |= (val & 0x02) >> step; ++step;}
//...etc...
if(MASK & 0x80) {result |= (val & 0x80) >> step; ++step;}
return result;
}
Run Code Online (Sandbox Code Playgroud)
当我实例化这个函数时(下面的所有值都只是示例值):
uint8_t someval = Foo<0xAA>(44);
Run Code Online (Sandbox Code Playgroud)
编译器优化了Foo()中的if语句,因为它在编译时知道if()语句的结果是什么.
这很好,但是由于创建了局部变量步骤,尝试在C中执行相同操作是有问题的.
如果步骤不存在,你可以像这样做一个大的#define:
#define Foo(MASK, val) (\
((MASK & 0x01) ? (val & 0x01) : 0) | \ …Run Code Online (Sandbox Code Playgroud)