I can probably give more in depth review, but here's some suggestions with a
quick look:
`IDisposable` - On classes such as Module or NDArray, I would implement the
IDisposable interface to be consistent with dotnet, allowing usage with the
`using` statement.
~Module()
{
/* If Dispose was not called before, clean up in the finalizer */
Dispose();
}
public void Dispose()
{
/* Tell gc to not run finalizer.
Saves this object from potentially being moved to higher gc
generations */
GC.SuppressFinalize(this)
if (!UIntPtr.Zero.Equals(moduleHandle))
{
/* ... */
}
}
I would even suggest a step further and implement the [disposable
pattern](https://docs.microsoft.com/en-us/visualstudio/code-quality/ca1063?view=vs-2019),
possibly as a base class (ex TVMDisposable), and overriding the "`protected
virtual void Dispose(bool disposing)`" shown in the previous link.
**Exceptions** - Don't be shy about throwing exceptions. They provide valuable
information and hard for developers to ignore :). For example in `Runtime.cs`,
the line: `graphJsonString =
Utils.ReadStringFromFile(runtimeParam.graphJsonPath);`
(Utils.ReadStringFromFile returns null) should throw an exception to caller as
not being able to read that is indeed something "exceptional". I would also
throw in cases where you have things like `if (!isInstantiated) {
Console.WriteLine("Not instantiated yet!"); return; }`
For the "C" functions that return error codes, I would suggest throwing on
those, possibly with an Exception subclass. Maybe "`public class TVMException
: Exception`" and subclassing for individual exceptions? Then adding a helper
method like:
internal static ThrowIfError(int tvmErrorCode, string message)
{
switch(tvmErrorCode)
{
case TVMErrorCode.SomethingBadHappened:
throw new TvmSomethingBadException(message);
break;
case ...: /* all other exceptions */
}
}
Then usage like this where you do a p/invoke:
`ThrowIfError(TVMFuncFree(ptr));`
**Native Library** There is a `public const string libName =
"tvmlibs/libtvm_runtime.so";` On Windows this DLL would be called
`tvm_runtime.dll`. With dotnet core, if you just specify "tvm_runtime", on
linux, dotnet will automatically search for "libtvm_runtime.so", in the hosts
library search paths (and LD_LIBRARY_PATHS) and on windows dotnet will
automatically search for "tvm_runtime.dll" according to Windows' library path
resolution (current directory, then everything in PATH). I'm not sure if this
the behavior you were looking for or not, but food for thought.
**Conventions** Probably my most trivial suggestion :). I would have some
convention for private class level variables to easily distinguish them from
local function variables. It makes parsing the code with your eyes a bit
easier. In the project's C++ code they use an underscore postifx
"myVariable_". In dotnet, its common for class level variables to have an
underscore prefix, like "_myVariable". There's other conventions, but my
suggestion is to have one.
I may have more suggestions, but I'm hungry :slight_smile:. I know your code
is early in implementation and some of these suggestions might be something you
already planned, but I've taken an interest as we do a lot of dotnet at work
and this will be useful.
---
[Visit
Topic](https://discuss.tvm.ai/t/introducing-tvm-net-for-bringing-tvm-features-into-net-world/6213/8)
to respond.
You are receiving this because you enabled mailing list mode.
To unsubscribe from these emails, [click
here](https://discuss.tvm.ai/email/unsubscribe/a0f085fae1910bfb7d16dca37fc37da05af3608acc37f7b59b916c1ea0ed13c2).