В этом проекте они использовали метод с именем Dynamic GetSystessetting (String Paramcode, String Paramtype) . Он содержит (int, float, bool, string, guid) значения. Это один из наиболее используемых методов в приложении. < /P>
Я знаю, что динамика плохая. Мне нужно больше контекста < /p>
Эта функция, < /p>
Код: Выделить всё
public dynamic GetSystemSetting(string paramCode, string paramType)
{
dynamic result = "";
// Code implementation here
switch(paramType)
{
case "B":
result = _dataService.Get(paramCode).BitValue;
break;
case "S":
result = _dataService.Get(paramCode).StringValue;
break;
case "N":
result = _dataService.Get(paramCode).NumericValue;
break;
case "G":
result = _dataService.Get(paramCode).GuidValue;
break;
}
return result;
}
Вот что я сделал
Я сравнил с динамическим ключевым словом, и я наблюдал, как виды стоимости становятся коробными и объединенными памятью на целом. Поэтому мне нужно разъяснить, была ли это хорошей реализацией, и я также хочу знать, что мой эталон имеет смысл.
Код: Выделить всё
using BenchmarkDotNet.Attributes;
namespace Benchmark_EfCore.Benchmarks;
[MemoryDiagnoser]
public class DynamicBenchmark
{
private List IntList { get; set; } = new List();
private List GuidList { get; set; } = new List();
[GlobalCleanup]
public void GlobalSetup()
{
IntList = Enumerable.Range(0, 100).ToList();
for (var i = 0; i < IntList.Count; i++)
{
GuidList .Add(Guid.Empty);
}
}
[Benchmark]
public dynamic GetIntValue()
{
return IntList.Find(a => a == 50);
}
[Benchmark]
public int GetValueExplicit()
{
return IntList.Find(a => a == 50);
}
[Benchmark]
public dynamic GetGuidValue()
{
return GuidList.Find(a => a == Guid.Empty);
}
[Benchmark]
public Guid GetGuidValueExplicit()
{
return GuidList.Find(a => a == Guid.Empty);
}
}
// * summary *
Benchmarkdotnet v0.13.7, Windows 11 (10.0.22631.5699)
Phileby Gen Core I3-1115G4 3,00GHCHGHGHGHGHGHGHGHCH-z. Cores
.net SDK 8.0.404
[host]: .net 8.0.17 (8.0.1725.26602), x64 ryujit avx2
defaultjob: .net 8.0.17 (8.0.1725.26602), x64 ryujit avx2 < /p> p> div 2
div Div2 < /p> div 2
div Div2 < /p> div 2
div Div. class = "s-table-container">
method < /th>
mean < /th>
4.0551 ns < /td>
0.0076 < /td>
0.5383 ns
-
-
GetGuidValue
4,6831 ns < /td>
0,1457 ns < /td>
0,2181 ns < /td>
4.66 ns < /td>
0.0102 < /td>
32 b < /td>
< /tr>
getGuidValeExplicit Справа; "> 0,9470 нс < /td>
0,0466 NS < /td>
0,0573 ns < /td>
-
-
Also I decompiled the code with IL Viewer in Rider and it looks like,
[Benchmark(22, "D:\\Benchmark_EfCore\\Benchmarks\\DynamicBenchmark.cs")]
[return: Dynamic]
public object GetIntValue()
{
return (object) this.IntList.Find(DynamicBenchmark.c.9__9_0 ?? (DynamicBenchmark.c.9__9_0 = new Predicate((object) DynamicBenchmark.c.9, __methodptr(b__9_0))));
}
[Benchmark(28, "D:\\Benchmark_EfCore\\Benchmarks\\DynamicBenchmark.cs")]
public int GetValueExplicit()
{
return this.IntList.Find(DynamicBenchmark.c.9__10_0 ?? (DynamicBenchmark.c.9__10_0 = new Predicate((object) DynamicBenchmark.c.9, __methodptr(b__10_0))));
}
< /code>
Я хотел знать, является ли эта вспомогательная функция хорошей практикой или значительно плохой. Это было на самом деле на EF 6 (не EF Core).
Не могли бы вы объяснить мне об этом динамическом использовании и о том, как оно влияет на приложение во время выполнения и когда дело доходит до пута.
Подробнее здесь: https://stackoverflow.com/questions/797 ... alue-types
Мобильная версия