public string FirstName { set; get; } public string LastName { set; get; } } 并让Person类继承IFormattable ,代码如下: class Person:IFormattable { public string FirstName { set; get; } public format, IFormatProvider formatProvider) { //关键代码,后面给出 } } 这里将会列出需要实现IFormattable formatType == typeof(ICustomFormatter)) return this; return null; } } 三、实现Person类IFormattable = typeof(ICustomFormatter)) return this; return null; } } class Person:IFormattable
,后面传入的填充对象必须要实现IFormattable接口。 定义Person类,并实现IFormattable接口: public class Person : IFormattable { public string Name { get; set; } 针对IFormattable接口,我们总结一下: 对于两种序号,不管是哪种格式的序号: 1. 如果填充的参数实现IFormattable接口,即使是简单格式符也和特殊格式符一样,会调用填充对象实现的IFormattable接口的ToString方法。 .Net Framework中的源码逻辑: IFormattable formattable = item as IFormattable; if (formattable !
为了能使调用者在调用对象实例的ToString()方法的时候,选择格式和语言文化,该对象应该实现System.IFormattable接口,接口代码如下: // // 摘要: / - 或 - null 引用(在 Visual Basic 中为 Nothing),用于使用为 System.IFormattable 实现的类型定义的默认格式。 Guid是实现IFormattable接口,具体的实现如下: public unsafe string ToString(string format, IFormatProvider provider) DateTime实现了IFormattable接口,所以它可以自定义地构造我们想要的DateTime字符串,具体实现如下: 第一步: ? 4、IFormattable接口实现方法参数解析 (1)、IFormatProvider参数 DateTime默认的ToString()方法 ?
本文将循序渐进地讨论ToString(),以及相关的IFormattable、IFormatProvider以及ICustomFormatter接口。 Microsoft显然想到了这一问题,并为我们提供了IFormattable接口。当你作为一名类型设计者,期望为你的用户提供自定义的格式化ToString()时,可以实现这个接口。 类型设计者的工作在这里就完结了,现在让我们看下对于这个实现了IFormattable的类型,类型的用户该如何使用自己定义的方法对对象进行字符串格式化。 在类型外部提供自定义格式字符串的能力 现在我们站在一个类型用户的角度来思考一下:很多时候,类型的设计者并没有为类型实现IFormattable接口,此时我们该如何处理呢? 如果类型实现了IFormattable接口,我们可以在类型上调用ToString()方法,传递IFormatProvider对象;如果类型没有实现IFormattable接口,我们可以通过String.Format
例: Public struct Nullable<T>:IFormattable,IComparable,IComparable<Nullable<T>>,INullable where T:struct EntityDictionary<TKey,TValue>: System.Collections.Generic.Dictionary<TKey,TValue> Where TKey:IComparable,IFormattable
一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable。这对类型来说,是一种主动实现的方式,要求开发者可以预见类型在格式化方面的要求。
但即使是重写了ToString()方法,提供的字符串输出也是非常单一的,而通过实现IFormattable接口的ToString()方法,可以让类型根据用户的输入而格式化输出。 下面我们来看一个简单的小例子:
public class Person:IFormattable
{
public string IDCode { get; set; } 其实还有另外一种变通的形式,就是将这两种方式合并一起使用的过程,下面来看一下具体的实现代码:
public class Person:IFormattable
{
public ; set; }
public string LastName { get; set; }
///
实现了 IFormattable 接口: 在 KeyGesture 上实现 IFormattable 本次更新实现了 IFormattable 接口,增强了 KeyGesture 的可读性,尤其在用户界面中使用时
IFormattable接口有一个满足该需求的方法:ToString(string, IFormatProvider),可是该如何确保传入的列表符合要求呢? 尽管decimal类型实现了IFormattable接口,但是它不能转换为List<IFormattable>类型。 说明 关于List<decimal>不能转换为List<IFormattable>类型的原因,第4章介绍泛型型变时会深入探讨,这里暂且只考虑泛型约束的内容。 下面解释一下这个例子中类型约束要表达的信息:PrintItems方法参数需要一个列表,其中保存的是某个类型的元素,这些元素都 要实现IFormattable接口。 通过约束,编译器就可以知道T实现了IFormattable接口,于是才会允许该T类型的值调用IFormattable.ToString(string, IFormatProvider)方法。
: 'Enums.Derived': cannot derive from sealed type 'Enums.Color' 接下来,我们看看枚举和这3个接口的关系:IComparable, IFormattable IFormattable 1: using System; 2: 3: namespace Enums 4: { 5: internal enum Color 6: uint, long, 或ulong数据类型 默认的,enum是一个sealed类,既无法被继承 enum类型隐式实现了System.Enum enum类型继承了3个接口:IComparable, IFormattable
"; 10 //支持的隐式类型转换 11 IFormattable s5 = $"Hello, {person.Name}"; 12 FormattableString s6 = $"Hello, {person.Name }" 新语法支持表达式求值,支持:格式化操作,还支持到IFormattable的隐式转换,编译结果是利用 System.Runtime.CompilerServices.FormattableStringFactory.Create
int i = 5; object obj = i; IFormattable ftt = i; Console.WriteLine(System.Object.ReferenceEquals(i, obj int i = 5; object obj = i; IFormattable ftt = i; Console.WriteLine(System.Object.ReferenceEquals(i, obj
int i = 5; object obj = i; IFormattable ftt = i; Console.WriteLine(System.Object.ReferenceEquals(i, obj int i = 5; object obj = i; IFormattable ftt = i; Console.WriteLine(System.Object.ReferenceEquals(i, obj
(2)AppendFormat AppendFormat方法将文本添加到 StringBuilder的结尾处,而且实现了 IFormattable接口,因此可接受格式化部分中描述的标准格式字符串。
类型格式化字符串 IFormattable和IFormatProvider的用法。这个两个接口项目中不常使用,但是IFormatProvider倒是可以作为分离变化的教程来学习。
}
///
publicstaticboolAreAlmostEqual<T>(thisT a,T b,double epsilon = ModuleConstants.Epsilon)whereT:struct,IComparable,IConvertible,IFormattable publicstaticboolIsGreaterThan<T>(thisT a,T b,double epsilon = ModuleConstants.Epsilon)whereT:struct,IComparable,IConvertible,IFormattable
方法将多个对象格式化成一个字符串Format方法解析格式字符串的原理: (1)、格式字符串中的{0}会被替换成格式字符串之后的第一个参数,以此类推 (2)、Format方法解析格式字符串时,发现可替换参数0,则调用对应参数的IFormattable 如果格式化字符串中的可替换参数0后面跟着格式限定符.则将格式限定符传递给ToString方法.没有则传递默认的方法. (3)、、Format方法解析格式字符串时,发现可替换参数0,如果对应参数没有继承IFormattable 接口,则调用该类型的ToString()方法,没有则调用Object的ToString方法. var str = string.Format("没有继承IFormattable接口的自定义类型:{0}, 继承了IFormattable接口的自定义类型:{1}", new Program(),1); Console.WriteLine(str); ?
4、继承、泛型、接口、类型约束等等高级特性,都有着良好且自洽的设计 最初接触C#的时候,看看int的原型,收获很大: public struct Int32 : IFormattable, IConvertible
4、在两个数组之间复制时,如果仅从数组类型证明不了两者的兼容性,比如从 Object[转型为IFormattable[],就根据需要对元素进行向下类型转换。 如果 Object[]中的每个对象都实现了IFormattable,Copy方法就能成功执行。 System.Buffer的BlockCopy支持同类型数组的简单复制。
继承类能够重写该方法,以便自己定义显示输出内容,假设继承类须要控制很多其它格式化输出,则须要实现IFormattable接口 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn