Make private & internal classes sealed and less enumeration of lists & LINQ (#2197)

This commit is contained in:
Henrik
2026-04-29 09:39:02 +02:00
committed by GitHub
parent 464cb337ba
commit 512f024667
11 changed files with 32 additions and 46 deletions
+5 -7
View File
@@ -10,7 +10,7 @@ namespace Dapper
private readonly Dictionary<string, Clauses> _data = new Dictionary<string, Clauses>();
private int _seq;
private class Clause
private sealed class Clause
{
public Clause(string sql, object? parameters, bool isInclusive)
{
@@ -23,7 +23,7 @@ namespace Dapper
public bool IsInclusive { get; }
}
private class Clauses : List<Clause>
private sealed class Clauses : List<Clause>
{
private readonly string _joiner, _prefix, _postfix;
@@ -36,11 +36,9 @@ namespace Dapper
public string ResolveClauses(DynamicParameters p)
{
foreach (var item in this)
{
p.AddDynamicParams(item.Parameters);
}
return this.Any(a => a.IsInclusive)
ForEach(item => p.AddDynamicParams(item.Parameters));
return Exists(a => a.IsInclusive)
? _prefix +
string.Join(_joiner,
this.Where(a => !a.IsInclusive)
+12 -12
View File
@@ -10,7 +10,7 @@ namespace Dapper
/// </summary>
public sealed class DefaultTypeMap : SqlMapper.ITypeMap
{
private readonly List<FieldInfo> _fields;
private readonly FieldInfo[] _fields;
private readonly Type _type;
/// <summary>
@@ -42,7 +42,7 @@ namespace Dapper
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
Type.DefaultBinder,
propertyInfo.PropertyType,
propertyInfo.GetIndexParameters().Select(p => p.ParameterType).ToArray(),
Array.ConvertAll(propertyInfo.GetIndexParameters(), p => p.ParameterType),
null)!.GetSetMethod(true);
}
@@ -54,9 +54,9 @@ namespace Dapper
.ToList();
}
internal static List<FieldInfo> GetSettableFields(Type t)
private static FieldInfo[] GetSettableFields(Type t)
{
return t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).ToList();
return t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
}
/// <summary>
@@ -156,20 +156,20 @@ namespace Dapper
// preference order is:
// exact match over underscore match, exact case over wrong case, backing fields over regular fields, match-inc-underscores over match-exc-underscores
var field = _fields.Find(p => string.Equals(p.Name, columnName, StringComparison.Ordinal))
?? _fields.Find(p => string.Equals(p.Name, backingFieldName, StringComparison.Ordinal))
?? _fields.Find(p => string.Equals(p.Name, columnName, StringComparison.OrdinalIgnoreCase))
?? _fields.Find(p => string.Equals(p.Name, backingFieldName, StringComparison.OrdinalIgnoreCase));
var field = Array.Find(_fields, p => string.Equals(p.Name, columnName, StringComparison.Ordinal))
?? Array.Find(_fields, p => string.Equals(p.Name, backingFieldName, StringComparison.Ordinal))
?? Array.Find(_fields, p => string.Equals(p.Name, columnName, StringComparison.OrdinalIgnoreCase))
?? Array.Find(_fields, p => string.Equals(p.Name, backingFieldName, StringComparison.OrdinalIgnoreCase));
if (field is null && MatchNamesWithUnderscores)
{
var effectiveColumnName = columnName.Replace("_", "");
backingFieldName = "<" + effectiveColumnName + ">k__BackingField";
field = _fields.Find(p => string.Equals(p.Name, effectiveColumnName, StringComparison.Ordinal))
?? _fields.Find(p => string.Equals(p.Name, backingFieldName, StringComparison.Ordinal))
?? _fields.Find(p => string.Equals(p.Name, effectiveColumnName, StringComparison.OrdinalIgnoreCase))
?? _fields.Find(p => string.Equals(p.Name, backingFieldName, StringComparison.OrdinalIgnoreCase));
field = Array.Find(_fields, p => string.Equals(p.Name, effectiveColumnName, StringComparison.Ordinal))
?? Array.Find(_fields, p => string.Equals(p.Name, backingFieldName, StringComparison.Ordinal))
?? Array.Find(_fields, p => string.Equals(p.Name, effectiveColumnName, StringComparison.OrdinalIgnoreCase))
?? Array.Find(_fields, p => string.Equals(p.Name, backingFieldName, StringComparison.OrdinalIgnoreCase));
}
if (field is not null)
+2 -12
View File
@@ -62,10 +62,7 @@ namespace Dapper
if (subDynamic.templates is not null)
{
templates ??= new List<object>();
foreach (var t in subDynamic.templates)
{
templates.Add(t);
}
templates.AddRange(subDynamic.templates);
}
}
else
@@ -212,14 +209,7 @@ namespace Dapper
}
// Now that the parameters are added to the command, let's place our output callbacks
var tmp = outputCallbacks;
if (tmp is not null)
{
foreach (var generator in tmp)
{
generator();
}
}
outputCallbacks?.ForEach(generator => generator());
}
foreach (var param in parameters.Values)
+1 -1
View File
@@ -6,7 +6,7 @@ namespace Dapper
/// <summary>
/// Handles variances in features per DBMS
/// </summary>
internal class FeatureSupport
internal sealed class FeatureSupport
{
private static readonly FeatureSupport
Default = new FeatureSupport(false),
+1 -1
View File
@@ -7,7 +7,7 @@ namespace Dapper
{
public static partial class SqlMapper
{
private class CacheInfo
private sealed class CacheInfo
{
public DeserializerState Deserializer { get; set; }
public Func<DbDataReader, object>[]? OtherDeserializers { get; set; }
+1 -1
View File
@@ -5,6 +5,6 @@
/// <summary>
/// Dummy type for excluding from multi-map
/// </summary>
private class DontMap { /* hiding constructor */ }
private sealed class DontMap { /* hiding constructor */ }
}
}
+1 -1
View File
@@ -12,7 +12,7 @@ namespace Dapper
/// </summary>
/// <typeparam name="TKey">The type to cache.</typeparam>
/// <typeparam name="TValue">The value type of the cache.</typeparam>
internal class Link<TKey, TValue> where TKey : class
internal sealed class Link<TKey, TValue> where TKey : class
{
public static void Clear(ref Link<TKey, TValue>? head) => Interlocked.Exchange(ref head, null);
public static bool TryGet(Link<TKey, TValue>? link, TKey key, [NotNullWhen(true)] out TValue? value)
+1 -1
View File
@@ -8,7 +8,7 @@ namespace Dapper
{
public static partial class SqlMapper
{
private class TypeDeserializerCache
private sealed class TypeDeserializerCache
{
private TypeDeserializerCache(Type type)
{
+4 -4
View File
@@ -29,7 +29,7 @@ namespace Dapper
/// </summary>
public static partial class SqlMapper
{
private class PropertyInfoByNameComparer : IComparer<PropertyInfo>
private sealed class PropertyInfoByNameComparer : IComparer<PropertyInfo>
{
public int Compare(PropertyInfo? x, PropertyInfo? y) => string.CompareOrdinal(x?.Name, y?.Name);
}
@@ -3534,9 +3534,9 @@ namespace Dapper
il.Emit(OpCodes.Ldloc, returnValueLocal); // [target]
}
var members = (specializedConstructor is not null
? names.Select(n => typeMap.GetConstructorParameter(specializedConstructor, n))
: names.Select(n => typeMap.GetMember(n))).ToList();
var members = Array.ConvertAll<string, IMemberMap?>(names, specializedConstructor is not null
? n => typeMap.GetConstructorParameter(specializedConstructor, n)
: n => typeMap.GetMember(n));
// stack is now [target]
bool first = true;
@@ -322,7 +322,6 @@ namespace Massive
var settings = (IDictionary<string, object>)expando;
var sbKeys = new StringBuilder();
const string stub = "UPDATE {0} SET {1} WHERE {2} = @{3}";
var args = new List<object>();
var result = CreateCommand(stub, null);
int counter = 0;
foreach (var item in settings)
@@ -1020,10 +1020,9 @@ namespace PetaPoco
{
get
{
var sb = new StringBuilder();
if (_lastSql == null)
return "";
sb.Append(_lastSql);
var sb = new StringBuilder(_lastSql);
if (_lastArgs != null)
{
sb.Append("\r\n\r\n");
@@ -1038,14 +1037,14 @@ namespace PetaPoco
public static IMapper Mapper { get; set; }
internal class PocoColumn
internal sealed class PocoColumn
{
public string ColumnName;
public PropertyInfo PropertyInfo;
public bool ResultColumn;
}
internal class PocoData
internal sealed class PocoData
{
public static PocoData ForType(Type t)
{
@@ -1272,7 +1271,7 @@ namespace PetaPoco
// ShareableConnection represents either a shared connection used by a transaction,
// or a one-off connection if not in a transaction.
// Non-shared connections are disposed
private class ShareableConnection : IDisposable
private sealed class ShareableConnection : IDisposable
{
public ShareableConnection(Database db)
{