Github user NightOwl888 commented on the issue:

    https://github.com/apache/lucenenet/pull/207
  
    Looks nice. Although, I tend to favor the "all methods are verbs" and "all 
properties are nouns or adjectives"  methodology. For example, I would expect a 
method named `Buffer()` to buffer something, not return a buffer. In this case 
that argument is a bit weaker, but it still feels like `GetContext()` would be 
more clear than `Context()`.
    
    I primarily named it `AcquireContext()` because it is essentially the same 
functionality as the existing `Acquire()` method (from Java), so the similar 
names seem natural. But `GetContext()` is also clear (and more concise).
    
    Hmm, that wasn't what I meant by "other subclasses". Actually, I made the 
constructor of `ReferenceContext` internal so it is effectively sealed to the 
outside world. What I was referring to is the fact that SearcherManger is just 
one of a few (with many more possible) subclasses of `ReferenceManager<G>`. 
    And since `ReferenceManager<G>` is generic, the `Reference` property is 
also generic and the cast is not necessary - its type is specific to the 
subclass of `ReferenceManager<G>`. 
    
    However, we can't very well name the property `Searcher` (so we have 
`context.Searcher`) because it wouldn't be generic enough for the other 
subclasses of `ReferenceManager<G>`. Well, we could by making extension methods 
and a custom "holder" type for each subclass of `ReferenceManager<G>`. But the 
disadvantage there is repetitive similar code. Maybe it would be worth it for 
such an integral part of the API, though.
    
    The purpose of the using block here isn't to dispose anything really - it 
is just to help ensure the variable isn't utilized after its reference is no 
longer tracked. The context is just a "holder" for the reference to implement 
`Dispose()` on, which tells the parent `ReferenceManager<G>` class that we are 
done using the reference. You can see an example of how it looks with the Java 
functions 
[here](https://github.com/synhershko/LuceneNetDemo/blob/master/LuceneNetDemo/GitHubIndex.cs#L157-L184)
 with a more verbose finally block. Same thing, but shaves a few lines of code 
off of the block. You don't gain much if you need to catch an exception, though 
because you still need to put a try catch inside of the using block.
    
    The using block does do one nice thing. Since it is a block, the variable 
goes out of scope when it is done.
    
    ```c#
    using (var context = searcherManager.AcquireContext)
    {
        var foo = context.Reference;
        foo.Search();
    } // foo goes out of scope
    ```
    The only issue is that it is not 100% obvious that this is a problem:
    
    ```c#
    Searcher foo;
    
    using (var context = searcherManager.AcquireContext)
    {
        foo = context.Reference;
    } // foo doesn't go out of scope - BAD
    
    foo.Search(); // Not allowed here
    ```
    
    But this just seems to be a scenario where there is no real way to force 
the end user to follow the rules. You just have to document the right way and 
hope they follow the documentation.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to